Objective c Cocoa:源列表数据的上下文菜单-非标题

Objective c Cocoa:源列表数据的上下文菜单-非标题,objective-c,cocoa,nstableview,nsmenu,Objective C,Cocoa,Nstableview,Nsmenu,我将一个菜单连接到tableview,但问题是当我右键单击源列表中的标题时,上下文菜单也会显示出来。有没有办法禁用此功能 因此,当isLeaf返回false(组头)时,它不应该显示菜单 我会尝试将自己设置为菜单的代表,并在-(void)menuedsupdate:(NSMenu*)菜单中删除所有项目 如果失败,只需子类NSTableView并实现-(NSMenu*)menuForEvent:(NSEvent*)事件如您所愿。对于我来说,菜单逻辑的最佳位置是委托,因此您可以将NSTableView

我将一个菜单连接到tableview,但问题是当我右键单击源列表中的标题时,上下文菜单也会显示出来。有没有办法禁用此功能


因此,当isLeaf返回false(组头)时,它不应该显示菜单

我会尝试将自己设置为菜单的代表,并在
-(void)menuedsupdate:(NSMenu*)菜单中删除所有项目


如果失败,只需子类NSTableView并实现
-(NSMenu*)menuForEvent:(NSEvent*)事件如您所愿。

对于我来说,菜单逻辑的最佳位置是委托,因此您可以将
NSTableView
子类化,并制作类似的内容(在本例中,有
NSOutlineView
,但它不符合要求)

@协议MYOutlineViewDelegate;
@接口MYOutlineView:NSOutlineView
@属性(分配)id委托;
@结束
@协议MYOutlineViewDelegate
-(NSMenu*)大纲视图:(NSOutlineView*)大纲视图菜单项:(id)项;
@结束
@MYOutlineView的实现
@动态委托;
-(NSMenu*)菜单事件:(NSEvent*)事件
{
NSMenu*menu=nil;
n点点击点=[self convertPoint:[theEvent Location InWindow]fromView:nil];
id item=[self itemAtRow:[self rowAtPoint:point]];
if([self.delegate respondsToSelector:@selector(大纲视图:菜单项:)])){
menu=[self.delegate大纲视图:self menuForItem:item];
}
返回菜单;
}
@结束

您可能需要使用
[[myTableView headerView]设置菜单:nil]以编程方式禁用它@特洛伊敌人-谢谢,但似乎不起作用。仍然显示。(我在加载nib后执行此操作)您是否知道如何复制默认的右键单击选择行为?当我使用selectRowIndexes时,它会将活动行传输到右键单击的行,但这不是默认情况——就像在xcode中右键单击文件一样——它会获得一个边框选择。这也是我没有覆盖menuForEvent时的默认设置。有什么建议吗?
@protocol MYOutlineViewDelegate;

@interface MYOutlineView : NSOutlineView

@property (assign) id<MYOutlineViewDelegate> delegate;

@end

@protocol MYOutlineViewDelegate <NSOutlineViewDelegate>

- (NSMenu *)outlineView:(NSOutlineView *)outlineView menuForItem:(id)item;

@end


@implementation MYOutlineView

@dynamic delegate;

- (NSMenu *)menuForEvent:(NSEvent *)theEvent
{
    NSMenu* menu = nil;

    NSPoint clickPoint = [self convertPoint:[theEvent locationInWindow] fromView:nil];
    id item = [self itemAtRow:[self rowAtPoint:point]];

    if([self.delegate respondsToSelector:@selector(outlineView:menuForItem:)]) {
        menu = [self.delegate outlineView:self menuForItem:item];
    }

    return menu;
}

@end