Как получить возвращаемое значение нажатой кнопки с помощью NSAlert

Я использую следующее:

tell current application's NSAlert's alloc's init()
  its setMessageText:"Alert test"
  its setInformativeText:"This is a test"
  its setAlertStyle:2
  its setShowsSuppressionButton:true
  its addButtonWithTitle:"Cancel"
  its addButtonWithTitle:"Replace"
  its beginSheetModalForWindow:theWindow modalDelegate:me didEndSelector:(missing value) contextInfo:(missing value)
end tell

Я хотел бы знать, как получить значение нажатой кнопки, включая «Кнопку подавления». заранее спасибо!


person TheOnlyOneHere    schedule 04.08.2019    source источник
comment
Это для проекта Xcode? В моих системах Sierra и Mojave использование didEndSelector приводит к сбою приложения при использовании чего-либо, кроме кнопки по умолчанию, поэтому похоже, что вернулась более ранняя ошибка - использование блочных методов через категории Myriad Helpers работает нормально.   -  person red_menace    schedule 04.08.2019
comment
Да, это для проекта xcode, есть ли способ сделать это?   -  person TheOnlyOneHere    schedule 04.08.2019


Ответы (1)


Используя категорию NSAlert+MyriadHelpers из Myriad Helpers, вы можете использовать метод showOverWithSuppress:calling:. Используя проект приложения AppleScript по умолчанию Xcode и добавив в него файлы категорий .h и .m, пример будет примерно таким:

property suppressed : false

on applicationWillFinishLaunching:aNotification
    tell current application's NSUserDefaults's standardUserDefaults
        its registerDefaults:{SuppressAlert:suppressed}
        set my suppressed to its objectForKey:"SuppressAlert"
    end tell
    set state to ""
    if not suppressed then set state to "not "
    set response to (display dialog "Example alert is currently " & state & "suppressed." buttons {"Clear", "Set", "Continue"} default button 3)
    if button returned of response is "Set" then
        set my suppressed to true
    else if button returned of response is "Clear" then
        set my suppressed to false
    end if
    doAlert()
end applicationWillFinishLaunching:

on doAlert()
    log "performing doAlert() handler"
    if suppressed then return -- skip it
    tell current application's NSAlert's alloc's init()
        its setMessageText:"Alert test"
        its setInformativeText:"This is a test"
        its setAlertStyle:2
        its setShowsSuppressionButton:true
        its addButtonWithTitle:"Cancel"
        its addButtonWithTitle:"Replace"
        its showOverWithSuppress:theWindow calling:"alertDidEnd:"
    end tell
end doAlert

on alertDidEnd:response
    set buttonName to (first item of response) as text
    if buttonName = "Cancel" then display alert "Cancel button clicked!"
    set my suppressed to (second item of response) as boolean
end alertDidEnd:

on applicationShouldTerminate:sender
    tell current application's NSUserDefaults's standardUserDefaults
        its setObject:suppressed forKey:"SuppressAlert" — update
    end tell
    return current application's NSTerminateNow
end applicationShouldTerminate:
person red_menace    schedule 04.08.2019
comment
Да, и если вы используете свойство или глобальную переменную для результата подавления, то это можно использовать позже, чтобы определить, отображается ли предупреждение снова. - person red_menace; 05.08.2019
comment
Если я хочу выбрать что-то вроде if и else, я должен включить их следующим образом: if buttonCancel = "Cancel" then display alert"Button Cancel clicked!" end if - person TheOnlyOneHere; 05.08.2019
comment
не могли бы вы привести пример? Я хотел бы запомнить решение пользователя с помощью кнопки подавления - person TheOnlyOneHere; 05.08.2019
comment
Обычно такие вещи сохраняются в пользовательских настройках по умолчанию с настройкой предпочтений или каким-либо другим способом для их сброса, поэтому я добавил это в свой пример. Обратите внимание, что пользовательские настройки по умолчанию не будут обновлены, если вы используете Xcode для остановки приложения. - person red_menace; 05.08.2019