我想设计一个有点像弹出框的面板:当鼠标在它外面时,它可能会关闭或隐藏自己。
但我不知道如何实现这一目标。我所知道的是视图可以处理-mouseDown
,-mouseUp
等。但是当鼠标放在其他地方时?我不知道如何捕捉这个事件。
进一步讨论Bavarious
:
我实际上正在研究状态栏。我关注了一个问题。还有我研究的示例代码。
正如示例代码所做的那样,我重写了前面描述的视图并使用状态栏项的-setView:
方法对其进行了设置。我工作中的大部分代码与示例代码完全相同。以下是我认为与我的困惑有关的一些代码部分(顺便说一句,使用了 ARC):
...
@property (nonatomic) SEL disclickAction; // Called when "dismissed"
@property (nonatomic) SEL action; // Called when selected
@property (nonatomic, assign) id target;
...
- (void)dealloc
{
NSLog(@"%@ dealloc", self);
[self invalidate];
//[super dealloc];
}
- (void)mouseDown:(NSEvent *)theEvent
{
[self setHighlighted:![self isHighlighted]];
if (_target && _action &&
[_target respondsToSelector:_action])
{
[NSApp sendAction:_action to:_target from:self];
}
}
// Here is the code that Bavarious taught me:
- (void)setDisclickAction:(SEL)disclickAction
{
_disclickAction = disclickAction;
if (!_mouseEventMonitor)
{
if (_disclickAction)
{
self.mouseEventMonitor = [NSEvent
addLocalMonitorForEventsMatchingMask:(NSLeftMouseDownMask | NSRightMouseDownMask | NSOtherMouseDownMask)
handler:^NSEvent *(NSEvent *event) {
if (event.window != self.window)
{
[self actionDisclick:nil];
}
return event;
}];
[[NSNotificationCenter defaultCenter]
addObserver:self
selector:@selector(actionDisclick:)
name:NSApplicationDidResignActiveNotification
object:nil];
}
}
else if (!_disclickAction) // cancel operation
{
[NSEvent removeMonitor:_mouseEventMonitor];
_mouseEventMonitor = nil;
}
}
当鼠标在上面的位置按下时:
A:视图mouseDown
被调用,然后鼠标按下事件的本地观察者被通知。
B:通知鼠标按下事件的本地观察者。
C:通知辞职申请事件。
D:没有事件。鼠标按下事件的本地观察者都不是。这就是问题所在。