2

だから、ここに私の場合があります:

非標準のドキュメント ベースのアプリケーションを開発しており、いずれかのドキュメントに未保存の変更がある場合に終了を中止するシナリオを処理したいと考えています。

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

  • ユーザーがアプリケーションを終了しようとします ("Quit XXXXX"メニュー項目または"X"ボタンをクリックして)
  • 変更されたドキュメントはありますか?
  • いいえの場合: 終了
  • YES の場合: 変更されていないドキュメントがあることをユーザーに通知します。彼が続行したい場合は、終了します。そうでなければ、終了をキャンセルします。

そこで、デリゲート方式で行うことにしました。

私の Application delegateでは、次を実装しました。

  • -windowToClose:(トリガーNSWindowWillCloseNotification)
  • applicationShouldTerminate:
  • applicationShouldTerminateAfterLastWindowClosed:

今、それが私が考えていることです。applicationShouldTerminate:メソッド内:

  • NSTerminateNow変更されたドキュメントが存在しない場合に返す
  • NSTerminateCancel変更されたドキュメントがある場合に返します。その場合、アラート シートなどをポップアップ表示し、ユーザーが終了したいことを確認したら、[NSApp terminate:nil];

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

助言がありますか?

4

1 に答える 1

7

それは確かにそれを行う方法です。ただし、applicationShouldTerminate実装では、すぐにアラートをポップアップ表示しNSTerminateNow、ユーザーが [キャンセル] をクリックしなかった場合は戻る必要があります。NSTerminateCancelそれ以外は。後でアプリケーションを手動で終了する必要はありません。

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

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

于 2012-04-19T08:21:58.737 に答える