Control + Click不触发menuForEvent

时间:2011-08-20 00:42:09

标签: objective-c macos

全部,    所以我有一个NSBox的子类,并在其中有子视图,如标签和两个imageViews。我已经覆盖了menuForEvent:。但是,当我点击NSBox选择它然后再按Control +点击其任何子视图时,就永远不会调用menuForEvent:

我不明白为什么会这样。

2 个答案:

答案 0 :(得分:4)

NSView处理控制点击和右键单击的方式有所不同(正如jfewtr指出的那样)。如果点击属于子视图,则会显示右键单击的上下文菜单,但不会显示按住Control键单击

我对此感到惊讶,实际上在这里写了一篇关于它的帖子,详细信息如下:NSView control-click quirks

有两种可能的解决方案,但覆盖/自定义整个子视图树可能不是最佳选择。我发现最好的解决方法是在您的顶级视图(您的NSBox子类)中显式显示您的上下文菜单以进行控件单击:

- (void)mouseDown:(NSEvent *)theEvent
{
    if (theEvent.modifierFlags & NSControlKeyMask)
    {
        [NSMenu popUpContextMenu:[self menuForEvent:theEvent] withEvent:theEvent forView:self];
    }
}

虽然硬编码这种行为并不好,但它避免了操纵或遍历整个子视图树,这可能会导致更多有问题的副作用/错误。

答案 1 :(得分:1)

你需要在子视图中实现menuForEvent:并将事件转发到你的superview的(NSBox子类)menuForEvent实现:

- (NSMenu *)menuForEvent:(NSEvent *)event
{
    return [[self superview] menuForEvent:event];
}

我认为它会自动落到superview而不需要子类化子视图。我发现右键单击确实存在,但由于某种原因,控制点击不会。