【发布时间】:2013-04-16 08:54:23
【问题描述】:
我有一个NSOutlineView,并且还创建了一个菜单,当我右键单击任何元素时,它会显示为上下文菜单。
现在我有两个问题。
- 如何识别右键单击的元素,以便对上下文菜单中的任何功能采取相应的行动。
- 如何在实际打开上下文菜单之前更改上下文菜单,以根据右键单击的元素删除或禁用菜单项?
【问题讨论】:
标签: objective-c cocoa
我有一个NSOutlineView,并且还创建了一个菜单,当我右键单击任何元素时,它会显示为上下文菜单。
现在我有两个问题。
【问题讨论】:
标签: objective-c cocoa
clickedRow 方法(继承自 NSTableView)将为您提供行号。
然后可以使用NSOutlineView 的itemForRow 将行号转换为项目。
对于菜单部分,NSMenuDelegate方法menu:updateItem:atIndex:shouldCancel:在菜单显示之前被调用,所以你可以根据需要进行修改。
根据docs,你还得实现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时得到通知。
【讨论】: