2

所以,這裏是我的情況:如何正確處理Cocoa應用程序終止?

我正在開發一個非標準的基於文檔的應用程序,我想處理在任何文檔中仍存在未保存更改時終止終止的情況。

我的初步設想是:

  • 用戶試圖退出應用程序(或者通過"Quit XXXXX"菜單項或通過單擊"X"按鈕)
  • 是否有任何修改的文檔?
  • 如果否:退出
  • 如果是:通知用戶存在未修改的文檔。如果他想繼續,然後退出。否則取消終止。

所以,我決定這樣做的委託方式。

在我的應用程序代理,我已經實現了:

  • -windowToClose:(觸發NSWindowWillCloseNotification
  • applicationShouldTerminate:
  • applicationShouldTerminateAfterLastWindowClosed:

現在,這是我在想什麼。在applicationShouldTerminate:方法:

  • 返回NSTerminateNow如果沒有修改文件存在
  • 返回NSTerminateCancel,如果有修改的文檔。在這種情況下,彈出警報片或類似的東西,如果用戶確認他想退出,然後再打一個[NSApp terminate:nil];

這是正確的方式去了解它?

有什麼建議嗎?

回答

7

這的確是如何做到這一點。但是在你的applicationShouldTerminate實現中,你應該在那裏彈出提示,如果用戶沒有點擊取消,則返回NSTerminateNow;否則爲NSTerminateCancel。以後不需要手動終止應用程序。

編輯:將警報顯示爲表單,但將其作爲模態對話框運行,請在警報上調用beginSheetModalForWindow,然後致電[NSApp runModalForWindow:alert]。另外,在通過beginSheetModalForWindow的最終選擇器中,您需要呼叫[NSApp stopModal]退出模態循環。

但是,在這種情況下最好將警報作爲窗口的表單運行,並在您的applicationShouldTerminate實施中返回NSTerminateLater。然後,在警報的結束選擇器中,撥打[NSApp replyToApplicationShouldTerminate:]。蘋果公司建議您這樣做。

+0

好主意;不過,這裏是我用於YES-NO警報表(http://snippet.mx/Ra8E)的代碼。我怎麼能這樣做,以便它在相同的功能內返回? – 2012-04-19 08:33:06

相關問題