2016-06-12 64 views
0

所有支持NSWindowRestoration的OS X應用程序都可以通過選擇菜單項「退出並關閉所有窗口」(Option-Command Q)來關閉。這將禁用狀態恢復,並且下次打開應用程序時,所有窗口都將處於其默認位置。如何以編程方式終止NSApp而不編碼窗口狀態?

菜單項觸發NSApplication上的terminate:方法。但是常規的「關閉應用程序」菜單也是如此(命令Q)。

如何以編程方式「退出並關閉所有窗口」?我真的必須自己關閉所有窗戶,然後致電terminate:

當兩個動作都連接到相同的terminate:方法時,Apple如何神奇地決定要做什麼?

+0

爲什麼不直接在終止窗口循環並關閉它們? –

+0

@ l'L l因爲這將是額外的代碼來管理,而蘋果有一個解決方案,與一個簡單的方法調用。 – Klaas

回答

1

似乎並沒有很好的方法來做到這一點。您可能希望提交Apple請求的錯誤(以及爲什麼需要它的解釋)。

當兩個動作連接到同一個terminate:方法時,蘋果如何神奇地決定該怎麼做?

好,看着了AppKit的拆卸,似乎-[NSApplication terminate:]檢查,如果發件人是NSMenuItem一個實例。如果是,則檢查其userInterfaceItemIdentifier是否等於@"NSAlternateQuitMenuItem"

你可以用這個標識符創建一個虛擬菜單項,並將其作爲發送者傳遞給-terminate:,但由於這依賴於實現細節,因此可能隨時中斷。

另一個控制因素是系統偏好設置>常規>「退出應用程序時關閉窗口」的設置。這對應於用戶默認密鑰NSAlternateQuitMenuItem,但是,這又是一個實現細節。看起來你可以在調用-terminate:之前設置它,然後在-applicationWillTerminate:委託方法中刪除該設置。 (您的更改將與您的應用程序相關聯,它們不會影響其他應用程序或系統偏好設置中的設置。)當然,您必須確保禁用突然終止才能獲得該委託方法調用。

+0

我不知道,NSMenuItem上有一個'userInterfaceItemIdentifier'屬性。我只是在Objective-C中創建必要的接口定義來訪問它。非常感謝! – Klaas

+0

一些進一步的調查提出,這是唯一的菜單項,得到這樣的標識符。它最初不在那裏,但在應用程序啓動後一段時間自動添加。 – Klaas

+0

整個菜單項目不存在「最初」。它是在主菜單設置時由Cocoa創建的。如果您要依賴具有特定標識符的菜單項,這已經夠糟糕的了。絕對不要把它作爲唯一帶有標識符的項目。 –

相關問題