Нужна помощь с преобразованием AppleScriptObjC из AppleScript

0

Мне нужно предвосхитить это утверждением, что я не программист, поэтому мне нужно поговорить с ним. Я сделал то, что я описал ниже, используя руководства и множество проб и ошибок

У меня есть работающий AppleScript, который имеет 2 запроса имени пользователя и пароля, которые затем переходят к монтированию некоторых сетевых томов на основе поиска LDAP. Я создал новый проект AppleScriptObjC Xcode 6.4 и ввел код из рабочего AppleScript. Используя конструктор интерфейса, я создал простое окно ввода и связал его с помощью следующего кода:

-- IBOutlets
property theWindow : missing value
property accountName : missing value
property passwordName : missing value

-- IBActions (button clicks)
on setCredentialsFromUserInput_(sender)
    set accountName to accountName's stringValue()
    set passwordName to passwordName's stringValue()
end setCredentialsFromUserInput_

Я связал кнопку OK с IBAction, описанным выше, и поля ID и пароля с соответствующими IBOutlets выше. Проект собирается и работает нормально, но когда я нажимаю кнопку ОК, ничего не происходит. Он не приступает к выполнению остальной части кода в проекте. Я полагаю, что мне не хватает чего-то простого - мысли?

Обновление № 1:

Вот остальная часть кода в сценарии. Большая часть этого была импортирована из более ранней рабочей версии этого приложения, написанной в AppleScript Studio (я полагаю). Я ожидаю, что здесь вы найдете и другие ошибки, но моя главная проблема в том, почему, кажется, ничего не происходит, когда я нажимаю ОК.

-- Set text delimiters
-- From previous version of Map Drives application
on removechar(delim, sourcetxt) --remove delim from string source    
    try
        set OldDelims to AppleScript's text item delimiters -- save their     current state
        set AppleScript's text item delimiters to delim -- declare new delimiters
        set sourcelist to (every text item in sourcetxt) as list
        set sourcetxt to ""
        repeat with i from 1 to count of sourcelist
            set this_item to item i of sourcelist
            set sourcetxt to sourcetxt & this_item
        end repeat
        set AppleScript's text item delimiters to OldDelims -- restore them
        return sourcetxt
    on error
        set AppleScript's text item delimiters to OldDelims -- restore them in     case something went wrong
        end try
end removechar

on replacechar(delim, sourcetxt, replacement) --replace delim in string source     with replacement
    try
        set OldDelims to AppleScript's text item delimiters -- save their current state
        set AppleScript's text item delimiters to delim -- declare new delimiters

        set sourcelist to (every text item in sourcetxt) as list
        set sourcetxt to ""
        repeat with i from 1 to count of sourcelist
            set this_item to item i of sourcelist
            if i is equal to 1 then
                set sourcetxt to this_item
            else
                set sourcetxt to sourcetxt & replacement & this_item
            end if
        end repeat

        set AppleScript's text item delimiters to OldDelims -- restore them
        return sourcetxt
    on error
        set AppleScript's text item delimiters to OldDelims -- restore them in case something went wrong
    end try
end replacechar

-- Execute LDAP Query
on mapDrives_(accountname, passwordname)

    --setup ldap query
    set ldap_host to "LDAP HOST"
    set ldap_searchbase to "LDAP QUERY"
    set ldap_attribute to "NetworkResource"
    set query to "uid=\"" & accountname & "\""
    -- run ldap query

    try
        set networktest to do shell script "ping -c 1 " & ldap_host
    on error
        display alert "Unable to connect to server.

            Please check your internet connection and try again." as warning     default button "OK"
        restoreButton()
        return
    end try
    try
        set ldapresults to do shell script "ldapsearch -x -b " & ldap_searchbase & " -H ldap://" & ldap_host & " -D \"" & uName & "\"@" & ldap_host & " -w \"" & pWord & "\" -LLL " & query & " " & ldap_attribute & ""
    end try

    --Clean LDAP results
    --display dialog "results: " & ldapresults
    set cleanldapresults to removechar(space, ldapresults)
    --quit
    --display dialog "first pass: " & cleanldapresults
    set cleanldapresults to removechar(return, cleanldapresults)
    --display dialog "second pass: " & cleanldapresults
    set cleanldapresults to replacechar("\\", cleanldapresults, "/")

    --try
    set OldDelims to AppleScript's text item delimiters -- save their current state
    set AppleScript's text item delimiters to return -- declare new delimiters
    --separate out the cifs paths and load them into a list
    --display dialog "last pass: " & cleanldapresults
    try
        set mountpaths to (every text item in (do shell script "echo \"" & cleanldapresults & "\" | grep -o cifs_path=\"[^,]*\"")) as list
    on error
        display alert "Invalid drive mappings." as warning
        quit
    end try

    --display dialog mountpaths
    --iterate through mount paths and mount them
    repeat with i from 1 to count of mountpaths
        set this_item to item i of mountpaths
        set this_item to replacechar("cifs_path=", this_item, "")

        if this_item is not equal to "" then
            try
                -- display alert "Mapping: smb:" & this_item
                mount volume ("smb:" & this_item) as user name uName with password pWord
            on error
                display alert "Failed to map: smb:" & this_item & " with username: " & uName as warning
            end try
        end if

    end repeat
    display alert "Your network drives have been mapped." as informational default button "OK"
    restoreButton()
    set AppleScript's text item delimiters to OldDelims -- restore them
    quit

end mapDrives_

##################################################
# Application
on applicationWillFinishLaunching_(aNotification)
-- Insert code here to initialize your application before any files are opened 
end applicationWillFinishLaunching_

on applicationShouldTerminate_(sender)
-- Insert code here to do any housekeeping before your application quits 
return current application's NSTerminateNow
end applicationShouldTerminate_

end script
Брайан Пауэлл
источник

Ответы:

1

Вы близки. Я думаю, проблема в том, что вы создали два свойства (accountName и passwordName) для своих текстовых полей, но затем вы берете stringValues ​​из этих текстовых полей и затем пытаетесь сохранить эти строковые значения обратно в себя.

Если вы храните значения в отдельных переменных, код работает успешно.

 -- IBOutlets   
 property theWindow : missing value
 property accountName : missing value
 property passwordName : missing value

 -- IBActions (button clicks)
 on setCredentialsFromUserInput_(sender)
     set uname to accountName's stringValue()
     set pword to passwordName's stringValue()
     display alert "Username is " & uname & "\n\nPassword is " & pword
 end setCredentialsFromUserInput_

Инструкция по отображению предупреждений только там, чтобы вы могли видеть, что что-то происходит, когда вы нажимаете OK.

Алистер Макмиллан
источник
Спасибо за это. Нужно ли мне объявлять переменные name и pword выше? Один пример выглядел так: <property uname: "">
Брайан Пауэлл
Я не думаю, что вам нужно объявлять их как свойства. Я думаю, что вам нужно сделать это только для того, чтобы они были доступны как выходы при создании интерфейса. Это всего лишь предположения. До тех пор, пока я не увидел ваш вопрос, я даже не знал, что AppleScriptObjC - вещь, поэтому я не должен считаться экспертом. :)
Алистер Макмиллан
Это то место, где разум моего непрограммиста терпит неудачу. Я поиграю еще немного. Спасибо, что помог мне. Если у меня возникнут дополнительные вопросы (очень вероятно), я, вероятно, должен задать новый вопрос. Еще раз спасибо.
Брайан Пауэлл
Ну, я на самом деле собираюсь продолжить эту тему, потому что первоначальная проблема остается. Я создал новый uNameи pWordпеременные и поместил их в коде , где они необходимы для выполнения запроса LDAP, но после нажатия OK остальной части коды в проекте не выполняется. Кажется, что создает переменные, но не будет двигаться дальше.
Брайан Пауэлл
Если вы добавите часть «display alert», она отобразит правильные значения?
Алистер Макмиллан