簡體   English   中英

在MacOS中以編程方式關閉模式對話框

[英]Programmatically dismiss modal dialog in MacOS

我有一個來自MacOS應用程序的AppDelegate的警告對話框,需要使用新信息進行更新。 當有新信息可用時,我想以編程方式關閉舊對話框並顯示新對話框。 我嘗試了兩種方式,但都存在問題:

  1. 使用alert.runModal()

    如果我使用上面的方法,則會根據需要呈現一個模態。 然后,我可以稍后使用lockWarningModal.window.close()關閉該對話框,它可以使舊對話框消失, 但是它凍結了UI,因此我無法再與之交互。 我猜這是因為alert.runModal()是同步的,並且主線程仍然被阻塞。 但是,我不知道該如何發布。

  2. 使用alert.beginSheetModal(for: NSApplication.shared.windows.last!) { (response) in }

    如果我使用上述方法並使用NSApplication.shared.windows.last!.endSheet(alert.window)關閉對話框,則可以解決UI凍結問題。 但是, 該對話框已附加到主應用程序窗口 ,而未作為模態顯示在最前面。

如何獲得以編程方式可忽略的模式對話框?

您不能通過簡單地關閉其事件窗口來停止模型事件循環(或警報表)。 實際上,使用現代的NSAlert API,您永遠不必關閉或訂購該窗口-框架會為您處理。

對於以runModal()開頭的警報,請使用NSApplicationabortModal()stopModal()stopModal(withCode:) runModal()返回之后,向警報窗口發送orderOut(nil)將其刪除。

對於隨后執行完成塊的警報表,請使用NSWindowendSheet(_)endSheet(_:returnCode:) 您的完成區塊執行后,警報將自動刪除。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM