【问题标题】:cocoa + context sensitive menu on NSTableView with multiple rows selectedNSTableView 上的 cocoa + 上下文相关菜单,选择了多行
【发布时间】:2017-01-11 02:21:45
【问题描述】:

我在选中多个行时在控制上单击“控制上的上下文敏感菜单”时遇到问题。 Its working fine when a single row is selected and then control clicked on it. 我的实现方式如下所示:

-(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 事件。

the problem with the above code segment is, when multiple rows are selected and control clicked, it does not recognize the control click and does not go into that loop and hence not displaying the context menu.

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

谢谢

【问题讨论】:

  • -(void)doSingleClick 是如何被调用的?这可能是问题的原因。
  • [tableView setAction:@selector(doSingleClick)];在 awakeFromNib 所以只要有一个点击它就会被调用

标签: cocoa contextmenu


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

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

    您是否在 Interface Builder 中使您的表视图成为此类的实例?如果不是,您的实例仍然是一个 NSTableView,而您编写的子类就是 Ian Hickson might call“虚构作品”。

    【讨论】:

      【解决方案3】:

      Corbin 的答案是这里最好的答案。

      link text

      【讨论】:

        【解决方案4】:

        我不相信选择多行时会调用操作方法。

        NSTableView 中重写menuForEvent: 方法可能会容易得多。您必须创建一个 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];
        }
        

        【讨论】:

        • 我有一个 tableviewcontroller 类,它是 NSTableView 的子类。但是我在这个类中实现了 menuForEvent 方法,但由于某种原因它没有被调用。请你能告诉我我在哪里做错了吗?谢谢
        • 您还实施了什么会拦截点击?这可能没有被调用,因为点击正在其他地方被拦截。
        • 没有别的了。我已经实现了 [tableView setAction:@selector(doSingleClick)];在 awakeFromNib 和 [tableView setDoubleAction:@selector(doSingleClick)] 中;在 awakeFromNib 中拦截双击。我尝试在没有这些方法的情况下使用 mouseDown 和其他鼠标事件,但它们没有被调用,或者应用程序无法识别这些事件。但问题是即使选择了多行,然后我控制点击,它也会进入 doSingleClick 函数,但不会进入用于控制点击的循环。谢谢
        • 对不起是 [tableView setDoubleAction:@selector(doDoubleClick)];用于双击操作。
        • 如果你只想显示一个菜单(即当用户单击时你不需要做任何事情),我建议实现menuForEvent:not i> 将任何选择器分配给表格视图的action。否则,我会尝试找出您的 if 语句不起作用的原因。您是否尝试过像这样比较结果:([[NSApp currentEvent] modifierFlags] & NSControlKeyMask) != 0?我以前有过这样的问题。另外,尝试设置断点并检查调试器中的modifierFlags 以确保它是您期望的事件。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-22
        • 2023-03-14
        • 2013-06-10
        相关资源
        最近更新 更多