Скрыть MAAttachedWindow при нажатии за пределами - PullRequest
2 голосов
/ 15 января 2011

Я использую MAAttachedWindow для отображения настраиваемого окна под NSStatusItem в меню. Все работает нормально, но я не могу найти простой способ скрыть это, когда пользователь нажимает за пределами окна. Я хочу реализовать это поведение, потому что это то, что ожидает пользователь.

Этот код используется для отображения MAAttachedWindow:

- (void)toggleAttachedWindowAtPoint:(NSPoint)pt {
    if (!self.attachedWindow) {  
        self.attachedWindow = [[MAAttachedWindow alloc] initWithView:logView
              attachedToPoint:pt 
               inWindow:nil 
                 onSide:MAPositionBottom 
                atDistance:5.0];

  [self.attachedWindow setLevel:kCGMaximumWindowLevel];
 }

 if(isVisible)
  [self.attachedWindow makeKeyAndOrderFront:self];
 else
  [self.attachedWindow orderOut];
}

Этот код вызывается NSStatusItem с пользовательским представлением, которое перехватывает щелчок по нему.

Ответы [ 2 ]

9 голосов
/ 15 января 2011

Вы должны быть в состоянии сделать это с помощью метода делегата окна:

- (void)windowDidResignKey:(NSNotification *)notification

Установите себя в качестве делегата окна и реализуйте это, чтобы вызывать ваш метод переключения.

1 голос
/ 17 января 2013

Это основано на ответе Картер Аллен , но, возможно, будет полезно кому-то, поскольку я потерял пару часов, пытаясь выяснить причину EXEC_BAD_ACCESS, короче говоря, вы не можете release attachedWindow внутри его windowDidResignKey уведомления, поэтому используйте autorelease:

- (void)windowDidResignKey:(NSNotification *)aNotification {
    NSLog(@"MainWinDelegate::windowDidResignKey: %@", [aNotification object]);

    if (fAttachedWindow && [aNotification object] == fAttachedWindow) {
        [window removeChildWindow:fAttachedWindow];
        [fAttachedWindow orderOut:self];
        [fAttachedWindow autorelease];
        fAttachedWindow = nil;
    }
}
...