NSWindow windowDidResignKey не вызывается после повторного отображения окна - PullRequest
2 голосов
/ 18 июля 2011

У меня есть собственный подкласс NSWindow, который пользователь может переключать отображение одним нажатием кнопки. Я также хотел бы, чтобы окно исчезало, когда окно отказывается от статуса ключа (например, при нажатии пользователем вне окна).

У меня есть делегат, который реализует 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: не вызывается.

Ответы [ 3 ]

2 голосов
/ 30 июля 2011

Проблема заключалась в том, что в некоторых случаях пользовательское окно фактически не становилось ключевым окном после вызова [attachedWindow makeKeyAndOrderFront:self].

Я исправил это, добавив следующую строку перед повторным созданием окна:

[[NSApplication sharedApplication] activateIgnoringOtherApps:YES];

В приведенном выше фрагменте кода:

- (void) toggleWindowAtPoint:(NSPoint)point
{
   // Attach/detach window.
   if (!attachedWindow) 
   {
      [[NSApplication sharedApplication] activateIgnoringOtherApps:YES];
      attachedWindow = [[CustomWindow alloc] attachedToPoint:point];
      ....
0 голосов
/ 28 сентября 2013

Если вы хотите активировать окно без использования activateIgnoringOtherApps:, вы должны использовать NSPanel с NSNonactivatingPanelMask:

[[CustomPanel alloc] 
        initWithContentRect: NSZeroRect 
                  styleMask: NSNonactivatingPanelMask 
                    backing: NSBackingStoreBuffered 
                      defer: NO];
0 голосов
/ 22 июля 2011

Вы пытались вызвать [attachWindow makeFirstResponder: attachWindow] в своем методе переключения?

...