为什么在显示 NSAlert 之后没有任何效果?

Why is it that after showing an NSAlert nothing works?

为什么在显示 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 >>>>>>> ")

if alert.runModal()

这是在应用程序范围的模态会话中执行的

这里来自文档:

Summary

Runs the alert as an app-modal dialog and returns the constant that identifies the button clicked. Declaration

open func runModal() -> NSApplication.ModalResponse

My question is why.

注意 runModal returns 如何将模态的结果作为 NSModalResponsealert.runModal() 行之后的代码必须能够访问它 returns 的值,例如

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()