2011-12-20 14 views
2

私は、ウィンドウ(タブ)ごとに複数のドキュメントを持つNSDocumentベースのアプリケーションで作業しています。これは、ウィンドウのクローズを処理する必要があるため、クローズされる前にウィンドウに属するドキュメントを確認できることを意味します。これを行うために、私はstandardWindowButton:NSWindowCloseButtonを使用してNSWindowの閉じるボタンにアクセスし、このボタンのターゲット/アクションを標準の(そして私的な)_close:メソッドの代わりに私のメソッドに設定しました。Snow Leopardのウィンドウクローズボタンハイジャック

これはLionでうまくいきますが、Snow Leopardでは問題が発生します。モーダルダイアログが表示されるたびに、閉じるボタンが期待どおりに無効になります。しかし、モーダルダイアログが終了すると、Snow Leopardでは閉じるボタンが再び有効になることはありません。私は[closeButton setEnabled:YES]などを使用してプログラムでそれを再度有効にしようとしましたが、効果がないようです。私はこれがクローズボタンのターゲット/アクションを変更したときにのみ発生することを確認しました。

Snow Leopardでこの動作を回避する方法や、閉じるボタンをハイジャックする代替方法はありますか?ツールバーボタンの有効な状態を制御するのは何ですか?多分私はそこに何かを無効にすることができますか?

+1

ダイアログを表示する前にターゲットとアクションを削除してダイアログが終了したら追加するとどうなりますか? –

+0

私はそれを試してみたと思っていましたが、今私はそれを行い、それが動作するように見えます!ちょっと難しいですが、私の異なるモーダルダイアログのターゲット/アクションを追加したり削除したりするタイミングを正確に調べてください。ありがとう。 – krill

答えて

4

私はあなたがにwindowShouldClose使うことができると思っているだろう:デリゲートメソッドを

AppDelegateに窓のデリゲートを設定します。 AppDelegateでは、windowShouldClose:delegateメソッドを使用してcloseメソッドを呼び出し、NOを返してウィンドウを閉じるのを止めます。 あなたの方法であなたのすべての点検を行い、次に実行する:窓。私の例を参照

NSWindow * thisWindow; //--pointer to window that will be closed 
BOOL windowClose;//-- bool for confirming close of window. 

- (BOOL)windowShouldClose:(id)sender{ 
    thisWindow =sender;//-- set thisWindow to the sender window,the one that is to be closed) 
    //if (sender ==theWindow) {//--you can use this to do further checking 

     if (windowClose) {//-- Close window if YES 
      return YES; 
     } 
    //} 


    [self performSelector:@selector(myCloseWindow) ];//go to your method 
    windowClose =FALSE;//-- reset 
    return NO;//do not close window here 
} 

- (void) myCloseWindow { 
    NSLog(@"closing window");//-- do your stuff 
    windowClose =TRUE;//--give the ok to close the window 
    [thisWindow performClose:thisWindow];//-- perform the close, which will be redirected back to the delegate, which will now allow the window to close 
} 
+0

これはうまくいくと思われますが、このデリゲートメソッドは実際にはウィンドウが閉じられる直前に呼び出されます。これはドキュメントベースのアプリケーションのウィンドウの閉じるボタンと同義ではありません。たとえば、ドキュメントが保存されていない場合、ドキュメントアーキテクチャはウィンドウを閉じる前にドキュメントを保存するようにユーザーに依頼します。そのため、このデリゲートメソッドはユーザーの不満の後にのみ呼び出されます。 – krill