2

これは私のケースです:Cocoaアプリケーションの終了を正しく処理する方法は?

私は非標準のドキュメントベースのアプリケーションを開発していますが、文書の中にまだ変更が保存されていない場合、終了を中止するシナリオを処理したいと思います。

私の最初のアイデアは、次のとおりです。

  • ユーザーは、("Quit XXXXX"メニュー項目を介して、または"X"ボタンをクリックすることにより、どちらかの)アプリケーションを終了しようとし
  • 任意の変更されたドキュメントはありますか?
  • いいえの場合:終了
  • はいの場合:変更されていないドキュメントがあることをユーザーに通知します。もし彼が進めたいなら、やめてください。それ以外の場合はキャンセルを終了します。

だから私は委任状にすることにしました。私のアプリケーションデリゲートで

は、私が実装しました:

  • NSWindowWillCloseNotificationでトリガ)-windowToClose:
  • applicationShouldTerminate:
  • applicationShouldTerminateAfterLastWindowClosed:

は今、それは私が考えているものです。 applicationShouldTerminate:方法で:

  • 戻りNSTerminateNow変更されたドキュメントがある場合は何も変更された文書は、リターンNSTerminateCancel
  • を存在しない場合。その場合は、アラートシートなどをポップアップして、ユーザーが終了したいと確認した場合は、[NSApp terminate:nil];

これは正しい方法ですか?

提案がありますか?

答えて

7

それは本当にそれを行う方法です。しかし、applicationShouldTerminateの実装では、警告をすぐにポップアップし、ユーザがキャンセルをクリックしなかった場合はNSTerminateNowを返してください。それ以外の場合はNSTerminateCancelです。後で手動でアプリケーションを終了する必要はありません。

編集:アラートをシートとして表示するが、モーダルダイアログとして実行するには、beginSheetModalForWindowを呼び出してから[NSApp runModalForWindow:alert]に電話してください。さらに、beginSheetModalForWindowに渡す最後のセレクタでは、モーダルループから抜け出すために[NSApp stopModal]に電話する必要があります。

ただし、ウィンドウのシートとしてアラートを実行し、applicationShouldTerminateの実装でNSTerminateLaterを返す方がよい場合があります。次に、アラートの終了セレクタで[NSApp replyToApplicationShouldTerminate:]と呼び出します。これはAppleがこれを実装する方法をお勧めします。

+0

いいアイデア。ただし、ここではYES-NOアラートシート(http://snippet.mx/Ra8E)に使用しているコードを示します。どのように私はそれが同じ関数内に返されるようにすることができますか? –

関連する問題