【问题标题】:pass parameter to context menu's selector method [duplicate]将参数传递给上下文菜单的选择器方法[重复]
【发布时间】:2013-03-10 00:26:56
【问题描述】:

如何将参数传递给以下选择器?

   NSMenuItem *item3 = [[NSMenuItem alloc] initWithTitle:title3 action:@selector(uncheckrow:)  keyEquivalent:@""];

我想将行号传递给方法。

谢谢

编辑

我要传递的行是我首先右键单击的表的行。但它可以是任何整数变量..

【问题讨论】:

  • 您要传递哪一行以及该菜单项设置的上下文是什么,即它是用于主菜单还是上下文菜单?
  • 我更新了第一篇文章。谢谢

标签: objective-c methods parameters selector


【解决方案1】:

覆盖 menuForEvent: 在你的 tableview 的子类中,在你的控制器中取一些变量说'rowToApply'

- (NSMenu*) menuForEvent:(NSEvent*)event
{
    NSPoint point = [self convertPoint:[event locationInWindow] fromView:nil];
    NSInteger row = [self rowAtPoint:point];
    BOOL clickWasOnItem = (row > -1);
        if(clickWasOnItem) {
            controller.rowToApply = [self itemAtRow:row];// Controller can be datasource(or) delegate (or) someObject which can be accessible)
        }
    return [super menuForEvent:event];
}

您可以在 contextualMenu 项的操作方法中使用 rowToApply: (取消选中:)。

【讨论】:

    【解决方案2】:

    菜单项本身(item3您的 sn-p)将被发送到该方法,因此您可以通过这种方式识别特定的选定菜单项。你也可以设置 NSMenuItem 的 tag 属性,例如:[item3 setTag:3] 然后在你的 uncheckrow 方法中你可以使用NSInteger row = [sender tag];

    编辑:更新问题

    如果你想向这个方法发送一个任意整数,那么有一些选项,但它们并不是特别优雅。 AppKit 将始终将 NSMenuItem 作为发送者发送,因此您需要使整数可用于未选中的 NSMenuItem。请注意,NSMenuItems 可以通过menu 方法访问其父 NSMenus。所以如果父 NSMenu 本身有一些你可以利用的属性,你可以使用[[sender menu] thatProperty]。由于您正在显示 NSMenu 以响应右键单击表格的行,因此您可以在显示菜单之前设置属性。我建议继承 NSMenu 以添加您自己的“spawningRowIndex”属性(尽管选择更好的名称)。在显示 NSMenu 之前设置属性,当您收到 uncheckrow 时,您可以使用[[sender menu] spawningRowIndex]

    【讨论】:

    • 谢谢!我要发送的行不是所选菜单的行,而是用户首先右键单击以显示菜单的行。对不起,如果我没有指定这个。
    • @Justme 好的,我已经更新了我的答案,试图帮助解决已编辑的问题。恐怕我不知道一种优雅的方法来获取该方法的右键单击表格行的索引,但我可以建议一些不太优雅的方法。
    • 谢谢,但另一个答案更优雅..但还是谢谢你!赞成你的答案!