Hide MAAttachedWindow when clicking outside
I'm using an MAAttachedWindow to display a custom window under a NSStatusItem in the Menubar. Everything works fine, but I can't find an easy way to hide it when the user clicks outside of the window. I want to implement this behavior because it's what the user expects.
This is the code used to display the 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];
}
This code gets triggered by an NSStatusItem
with a custom view which intercepts a click on it.
You should be able to do this via the window's delegate method:
- (void)windowDidResignKey:(NSNotification *)notification
Set yourself as the window's delegate, and implement that to call through to your toggle method.
This is based on Carter Allen answer, but maybe will be helpfull to someone as i lost couple of hours trying to figure out the reason behind an EXEC_BAD_ACCESS
, in short you can't release
the attachedWindow
inside his windowDidResignKey
notification, so use 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;
}
}
精彩评论