全部,
所以我有一个NSBox
的子类,并在其中有子视图,如标签和两个imageViews。我已经覆盖了menuForEvent:
。但是,当我点击NSBox
选择它然后再按Control +点击其任何子视图时,就永远不会调用menuForEvent:
。
我不明白为什么会这样。
答案 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而不需要子类化子视图。我发现右键单击确实存在,但由于某种原因,控制点击不会。