Почему после показа NSAlert ничего не работает? - PullRequest
0 голосов
/ 06 мая 2020

Почему после отображения NSAlert ничего не работает, пока я не закрою NSAlert?

Я пытался напечатать оператор после отображения NSAlert, но print не работает.

Ниже я прикрепил свой код:

let alert: NSAlert = NSAlert()
alert.messageText = "Hello I am Message text"
alert.informativeText = "i am information"
alert.addButton(withTitle: "OK") // First Button
alert.addButton(withTitle: "Cancel") // 2nd Button
alert.alertStyle = NSAlert.Style.warning

alert.delegate = self
if alert.runModal() == .alertFirstButtonReturn {
    print("First Button clicked")
} else {
    print("Cancel button clicked")
}

print("after NSAlert >>>>>>> ")

enter image description here

Ответы [ 2 ]

2 голосов
/ 06 мая 2020

У меня вопрос почему.

Обратите внимание, как runModal возвращает результат модального окна как NSModalResponse. Код после строки alert.runModal() должен иметь доступ к возвращаемому значению, например,

let result = alert.runModal()
print(result)

Если код после runModal был запущен , как только отображается модальное окно, что бы было result? Пользователь еще не нажал ни одной кнопки в модальном окне, поэтому никто не знает!

Вот почему, когда вызывается runModal, выполнение кода просто приостанавливается там, на этой строке, пока пользователь не выберет одну из вариантов. runModal - это синхронный и блокировка .

Сравните это с alert.beginSheetModal, которое принимает закрытие completionHandler, и модальный ответ не возвращается, но перешел на completionHandler. Это позволяет коду после вызова продолжать работать, пока отображается модальное окно, потому что код после вызова не имеет доступа к модальному ответу. Только код в completionHandler работает. beginSheetModal - это асинхронный .


Если у вас есть что-то, что вы хотите распечатать, как только появится предупреждение, напишите это перед вызовом runModal и (необязательно) оберните его в вызов DispatchQueue.asyncAfter / DispatchQueue.async, чтобы ваш print был асинхронным.

DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 0.1) {
    print("Hello")
}
alert.runModal()
2 голосов
/ 06 мая 2020
if alert.runModal()

Это выполняется в модальном сеансе всего приложения

Вот из do c:

Сводка

Запускает предупреждение как app-модальное диалоговое окно и возвращает константу, идентифицирующую нажатую кнопку. Декларация

open func runModal() -> NSApplication.ModalResponse

...