我有一个NSOutlineView
并且还创建了一个菜单,当我右键单击任何元素时,它会显示为上下文菜单。
现在我有2个问题。
- 如何识别右键单击的元素,以便对上下文菜单中的任何功能采取相应的行动。
- 在我实际打开上下文菜单以根据右键单击的元素删除或禁用菜单项之前,如何更改上下文菜单?
我有一个NSOutlineView
并且还创建了一个菜单,当我右键单击任何元素时,它会显示为上下文菜单。
现在我有2个问题。
该clickedRow
方法(继承自NSTableView
)将为您提供行号。
然后可以使用NSOutlineView
's将行号转换为项目itemForRow
。
对于菜单部分,该NSMenuDelegate
方法menu:updateItem:atIndex:shouldCancel:
是在菜单显示之前调用的,因此您可以根据需要对其进行修改。
根据文档,您还必须实施numberOfItemsInMenu:
.
您可以将相同的对象设置为大纲视图和菜单的委托。
理论上,当右键单击一行时,它应该已经是 NSOutlineView 中选中的行。无论如何,这通常不会发生。
我通过实现以下方法(也回答了第二个问题)解决了这个问题:
- (void)menuNeedsUpdate:(NSMenu *)menu
将此方法插入您的一个类中并将该类注册为菜单委托(请注意:NSMenu,而不是单个 NSMenuItem)。在上面的代码中,我添加了这段代码,用于在右键单击时自动选择单击的行。
if ([[arrayController selectedObjects] count] == 0 || [[arrayController selectedObjects] count] == 1) {
if ([myTable clickedRow] != -1) {
[myTable selectRowIndexes:[NSIndexSet indexSetWithIndex:[myTable clickedRow]] byExtendingSelection:FALSE];
}
}
据我所知,这在 NSTableView 中可以正常工作,因此它也应该在您的 NSOutlineView 中工作。
关于第二个问题,您可以使用上述方法在每次显示 NSMenu 时得到通知。