0

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

在此处输入图像描述

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

我能够将 NSTableView 子类化并实现rightMouseDown:rightMouseUp:收到有关这些事件的通知,但是如果我将行单元格的菜单属性设置为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);
}

我想在下图中具有突出显示效果,但显示一个窗口而不是上下文菜单:

在此处输入图像描述

4

2 回答 2

0

首先是右键单击:在右键单击时明确选择行(例如通过此消息)。然后创建您自己的 NSWindow 后代,将自己的 NSView 类设置为 contentView,在视图中您可以绘制黑色背景、圆角边框等等。在您的右键单击处理程序中显示此窗口。

于 2013-04-19T12:56:13.833 回答
0

你可以使用一个NSPopover,它工作得很好。弹出框会为您创建一个窗口,即使它有些隐藏。例如,如果您向控件发送window消息,您将从控件中获取它,并且可以注册以侦听事件。

整个弹出框可以在 IB 中创建,只需要showRelativeToRect:ofView:preferredEdge:在代码中实现该方法。

要捕获右键单击事件,您可以使用rightMouseDown:,它最初在 NSResponder 中定义,但在 NSView 中被覆盖以简单地捕获事件并显示菜单,它不会在响应者链(或继承链,对于这个问题)。因此,您只需实现该方法即可调用showRelativeToRect:ofView:preferredEdge:.

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

的属性也可以在 IB 中设置NSPopovercontentViewController

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

本教程很有用。

于 2013-04-19T12:55:07.820 回答