自定义的NSView在NSMenuItem不接受鼠标事件(Custom NSView in NSMe

2019-08-04 07:58发布

我有一个NSMenu飞出使用popUpStatusItemMenu的NSStatusItem的。 这些NSMenuItems显示一串不同链接的,并且每一个与连接的setAction:到OpenLink的:一个目标的方法。 很长一段时间这样的安排一直工作正常。 用户选择从菜单和OpenLink的链接:那么方法处理它。

不幸的是,我最近决定使用NSMenuItem的的setView实验:方法来提供一个更好的/雨衣接口。 基本上,我刚停下设置标题,创建NSMenuItem,然后使用的setView:显示自定义视图。 这完美的作品,菜单项很好看,显示我的自定义视图。

但是,当用户选择一个菜单项,然后松开鼠标,动作不再有效(即,OpenLink公司:不叫)。 如果我只是单纯地注释掉的setView:打电话,然后再行动工作(当然,菜单项是空白,但得到正确执行操作)。 我的第一个问题,那么,这就是为什么设置视图打破了NSMenuItem的行动。

没问题,我想,我会在我的自定义视图检测mouseUp事件,并从那里打电话给我的操作方法解决它。 我加入这个方法我的自定义视图:

- (void)mouseUp:(NSEvent *)theEvent {
  NSLog(@"in mouseUp");
  }

没有骰子! 这种方法不会被调用。

我可以设置跟踪rects和接收的mouseEntered:事件,虽然。 我把我的常规的mouseEntered几个测试,如下所示:

if ([[self window] ignoresMouseEvents]) {  NSLog(@"ignoring mouse events");  }
else {  NSLog(@"not ignoring mouse events");  }
if ([[self window] canBecomeKeyWindow]) {  dNSLog((@"canBecomeKeyWindow"));  }
else {  NSLog(@"not canBecomeKeyWindow");  }
if ([[self window] isKeyWindow]) {  dNSLog((@"isKeyWindow"));  }
else {  NSLog(@"not isKeyWindow");  }

并得到了以下对策:

not ignoring mouse events
canBecomeKeyWindow
not isKeyWindow

这是什么问题? “不isKeyWindow”? 大概是因为苹果的文件说这是不好的“如果用户点击一个观点,即不在关键窗口,默认情况下被带到窗口推进,取得了关键,但鼠标事件时,不会调度。” 但是,必须有一种方法做检测这些事件。 怎么样?

添加:

[[self window] makeKeyWindow];

有没有效果,尽管canBecomeKeyWindow是YES。

Answer 1:

这种方法添加到您的自定义的NSView,它会正常工作与鼠标事件

- (void)mouseUp:(NSEvent*) event {
    NSMenuItem* mitem = [self enclosingMenuItem];
    NSMenu* m = [mitem menu];
    [m cancelTracking];
    [m performActionForItemAtIndex: [m indexOfItem: mitem]];
}

但我有与keyhandling问题,如果解决了这个问题,也许你可以去我的问题,帮我一点点。



Answer 2:

添加到您的自定义视图,你应该罚款:

- (BOOL)acceptsFirstMouse:(NSEvent *)theEvent
{
    return YES;
}


Answer 3:

我加入这个方法我的自定义视图,现在一切精美的作品:

- (void)viewDidMoveToWindow {
    [[self window] becomeKeyWindow];
}

希望这可以帮助!



Answer 4:

到目前为止,实现这一目标的唯一途径,就是在手动注册跟踪区域updateTrackingAreas -这是令人欣慰的调用,就像这样:

override func updateTrackingAreas() {
    let trackingArea = NSTrackingArea(rect: bounds, options: [.enabledDuringMouseDrag, .mouseEnteredAndExited, .activeInActiveApp], owner: self, userInfo: nil)
    addTrackingArea(trackingArea)
}


Answer 5:

最近,我需要显示的NSStatusItem自定义视图,其上单击并在状态图标支持拖放操作时,显示一个普通NSMenu。

我使用,主要是解决我的问题,是可以发现三个不同的来源这个问题。

希望它可以帮助其他人。



Answer 6:

请参阅从苹果示例代码名为CustomMenus在那里你会发现在ImagePickerMenuItemView类一个很好的例子。

这不是简单的或微不足道的,使在菜单中的行为像一个正常的NSMenuItem的视图。 有一些真正的决策和编码做。



文章来源: Custom NSView in NSMenuItem not receiving mouse events