我有一个NSOutlineView
,也创建了一个菜单,当我右键单击任何元素时显示为上下文菜单。如何获取在NSOutlineView的右键菜单中右键单击的元素?
现在我有2个问题。
- 如何识别右键单击的元素,以便在上下文菜单中的任何函数上相应地执行操作。
- 在我实际打开它以删除或禁用菜单项(取决于右键单击的元素)之前,我如何更改上下文菜单?
我有一个NSOutlineView
,也创建了一个菜单,当我右键单击任何元素时显示为上下文菜单。如何获取在NSOutlineView的右键菜单中右键单击的元素?
现在我有2个问题。
理论上,右键单击某行时,它应该已经是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时都会收到通知。
clickedRow
方法(继承自NSTableView
)会给你行号。
然后可以使用NSOutlineView
的itemForRow
将行号转换为该项目。
对于菜单部分,在显示菜单之前调用NSMenuDelegate
方法menu:updateItem:atIndex:shouldCancel:
,因此您可以根据需要对其进行修改。根据docs,您还必须执行numberOfItemsInMenu:
。
您可以为大纲视图和菜单设置与委托相同的对象。
整个OS X的默认行为是不自动选择被右击单击的项目(上下文菜单) – Jay