我有NSOutlineView
并且还创建了一个菜单,当我右键单击任何元素时,该菜单显示为上下文菜单。
现在我有两个问题。
答案 0 :(得分:1)
clickedRow
方法(继承自NSTableView
)会为您提供行号。
然后可以使用NSOutlineView
的{{1}}将行号转换为项目。
对于菜单部分,在显示菜单之前调用itemForRow
方法NSMenuDelegate
,因此您可以根据需要进行修改。
根据docs,您还必须实施menu:updateItem:atIndex:shouldCancel:
。
您可以为大纲视图和菜单设置与委托相同的对象。
答案 1 :(得分:0)
理论上,右键单击一行时,它应该已经是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时收到通知。