2011-07-18 24 views
2

ボタンのクリックで表示を切り替えるカスタムNSWindowサブクラスがあります。また、ウィンドウがキー状態を辞退すると(たとえば、ユーザーがウィンドウの外側をクリックして)、ウィンドウが消えるようにしたいと思います。NSWindow windowDidResignKeyが再表示された後に呼び出されない

私はwindowDidResignKey:を実装するデリゲートを持っていますが、このデリゲートメソッドは、ウィンドウが鍵をはじめて辞めるときにのみ呼び出されます。ここで

は、私は(ユーザーアクションやwindowDidResignKey経由)ウィンドウの表示を切り替える方法は次のとおりです。

- (void) toggleWindowAtPoint:(NSPoint)point 
{ 
    // Attach/detach window. 
    if (!attachedWindow) 
    { 
     attachedWindow = [[CustomWindow alloc] attachedToPoint:point]; 
     attachedWindow.delegate = self; 
     [attachedWindow setLevel:NSMainMenuWindowLevel+1]; // show window in front of all other apps on desktop 
     [attachedWindow makeKeyAndOrderFront:self]; 
    } 
    else 
    { 
     attachedWindow.delegate = nil; 
     [attachedWindow orderOut:self]; 
     [attachedWindow release]; 
     attachedWindow = nil; 
    }  
} 

ここwindowDidResignKeyの私の実装です:

- (void) windowDidResignKey:(NSNotification *)note 
{ 
    [self toggleWindowAtPoint:NSMakePoint(0, 0)]; 
} 

私が探してる初めてそのカスタムウィンドウが表示され、windowDidResignKey:が呼び出されます。その後、カスタムウィンドウが再表示されるたびにwindowDidResignKey:が呼び出されません。

答えて

2

場合によっては、[attachedWindow makeKeyAndOrderFront:self]を呼び出した後にカスタムウィンドウが実際にキーウィンドウにならないという問題がありました。あなたはせずにウィンドウをアクティブにする場合

- (void) toggleWindowAtPoint:(NSPoint)point 
{ 
    // Attach/detach window. 
    if (!attachedWindow) 
    { 
     [[NSApplication sharedApplication] activateIgnoringOtherApps:YES]; 
     attachedWindow = [[CustomWindow alloc] attachedToPoint:point]; 
     .... 
0

トグルメソッドで[attachedWindow makeFirstResponder:添付ウィンドウ]を呼び出してみましたか?

+0

ありがとうthe suggエステオン、それは私のために働かなかった。 – figelwump

0

:上記のコードのコンテキストで

[[NSApplication sharedApplication] activateIgnoringOtherApps:YES]; 

は、私は、ウィンドウを再作成する前に次の行を追加することで、これを固定しました activateIgnoringOtherApps:を使用する場合は、NSNonactivatingPanelMaskを使用してNSPanelを使用する必要があります。

[[CustomPanel alloc] 
     initWithContentRect: NSZeroRect 
        styleMask: NSNonactivatingPanelMask 
        backing: NSBackingStoreBuffered 
         defer: NO]; 
関連する問題