右键单击NSTableView显示NSWindow

时间:2013-04-19 10:21:04

标签: objective-c macos cocoa nstableview nswindow

当您右键单击NSTableView中的项目时,我想显示NSWindow,类似于右键单击对象时Interface Builder中显示可用插座的方式:

enter image description here

不幸的是,您只能使用NSMenu子类作为菜单属性。 我也没有找到NSTableView的委托方法来通知右键点击。

我能够继承NSTableView并实现rightMouseDown:rightMouseUp:以获得有关这些事件的通知,但如果我将行单元格的menu属性设置为nil,则它们不是右键单击时突出显示,即使我调用超级实现):

- (void)rightMouseDown:(NSEvent *)theEvent {
    [super rightMouseDown:theEvent];
    NSPoint eventLocation = [theEvent locationInWindow];
    eventLocation = [self convertPoint:eventLocation fromView:nil];
    NSInteger rowIndex = [self rowAtPoint:eventLocation];
    NSLog(@"Right clicked at row index %d", rowIndex);
}

我想在下面的图片中有高亮效果但是显示一个窗口而不是上下文菜单:

enter image description here

2 个答案:

答案 0 :(得分:0)

您可以使用NSPopover,效果非常好。弹出窗口会为您创建一个窗口,即使它有点隐藏。例如,如果您向他们发送window消息,您可以从控件中获取它,并且可以注册以侦听事件。

整个popover可以在IB中创建,只需在代码中实现showRelativeToRect:ofView:preferredEdge:方法。

要捕获右键单击事件,您可以使用最初在NSResponder中定义的rightMouseDown:,但在NSView中重写以简单地捕获事件和显示菜单,并且它不会向上传递事件。响应者链(或继承链,就此而言)。因此,您只需实现该方法即可调用showRelativeToRect:ofView:preferredEdge:

您通常需要将内容放在NSViewController及其随附的nib文件中。

NSPopover的{​​{1}}属性也可以在IB中设置。

总而言之,需要的代码不多。

This tutorial很有用。

答案 1 :(得分:0)

首先右键单击:右键单击显式选择行(例如via this message)。然后创建自己的NSWindow后代,将自己的NSView类设置为contentView,在视图中,您可以绘制黑色背景,圆形边框和不是。在右键单击处理程序中显示此窗口。