将参数传递给上下文菜单的选择器方法

时间:2013-03-20 18:11:50

标签: objective-c methods parameters selector

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

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

我想将行号传递给方法。

由于

修改

我要传递的行是我在第一时间右键单击的表格行。但它可以是任何整数变量..

2 个答案:

答案 0 :(得分:1)

菜单项本身(item3您的代码段)将被发送到该方法,因此您可以通过该方式识别特定的所选菜单项。您还可以设置NSMenuItem的标记属性,例如:[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]

答案 1 :(得分: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 :( uncheckrow :)。