NSTableView上的cocoa +上下文敏感菜单,选择了多行

时间:2009-09-30 20:09:10

标签: cocoa contextmenu

我在控件上显示上下文相关菜单时遇到问题在选择多行时单击桌面视图。 选择单行然后单击控件时,它工作正常。 我实现这个的方式如下所示:

-(void)doSingleClick  
{  
    NSLog(@"single clicked");

    if([[NSApp currentEvent] modifierFlags] & NSControlKeyMask)
    {

        NSLog(@"control clicked.......");

        [NSMenu popUpContextMenu:[self showContextMenu] withEvent:[NSApp currentEvent] forView:tableView];

        return;
    }

}

和showContextMenu函数返回一个NSMenu对象。

我这样做是因为我的表视图因某些奇怪的原因无法识别mouseDown或mouseUp或menuForEvent事件。

上面代码段的问题是,当选择多行并单击控件时,它无法识别控件点击,也不会进入该循环,因此不会显示上下文菜单。

请建议我实现这一目标的机制。

由于

4 个答案:

答案 0 :(得分:17)

我不推荐上面答案中给出的方法。相反,请查看Leopard及更高版本中的“DragNDropOutlineView”示例。这和发行说明提供了一种适当的方法来实现单行或多行的上下文菜单。这包括让AppKit自动进行正确的突出显示。

科宾·邓恩 (NSTableView软件工程师)

答案 1 :(得分:1)

  

我有一个tableviewcontroller类,它是NSTableView的子类。

这是非常糟糕的命名,并表明您没有正确构建应用程序。视图不是控制器。将它们分开。

  

但是这个类我实现了menuForEvent方法,但由于某种原因没有被调用。

您是否在Interface Builder中使表查看此类的实例?如果没有,你的实例仍然是一个NSTableView,你写的子类是Ian Hickson might call“虚构的作品”。

答案 2 :(得分:1)

Corbin的答案是最好的答案。

link text

答案 3 :(得分:0)

我不相信在选择多行时调用action方法。

menuForEvent:中覆盖NSTableView方法可能会更容易。您必须创建NSTableView的子类才能执行此操作,但这将是一个更清晰的解决方案。

您还可以创建一个非正式协议(NSObject上的类别)并让NSTableView代理返回相应的菜单。

@interface NSObject (NSCustomTableViewDelegate)

- (NSMenu *)tableView:(NSTableView *)tableView menuForEvent:(NSEvent *)event;

@end

@implementation NSObject (NSCustomTableViewDelegate)

- (NSMenu *)tableView:(NSTableView *)tableView menuForEvent:(NSEvent *)event {
    return nil;
}

@end

在你的NSTableView子类中:

- (NSMenu *)menuForEvent:(NSEvent *)event {
    return [[self delegate] tableView:self menuForEvent:event];
}