单击外部时隐藏MAAttachedWindow

时间:2011-01-14 22:31:45

标签: objective-c cocoa event-handling nswindow show-hide

我正在使用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 个答案:

答案 0 :(得分:9)

您应该可以通过窗口的委托方法执行此操作:

- (void)windowDidResignKey:(NSNotification *)notification

将自己设置为窗口的委托,并实现它以调用切换方法。

答案 1 :(得分:1)

这是基于 Carter Allen 的答案,但也许会对某人有所帮助,因为我失去了几个小时试图找出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;
    }
}