上下文菜单项未被激活

时间:2009-08-31 22:40:20

标签: cocoa nsmenu

我遇到了问题。我的上下文菜单显示但菜单项未激活。 所以我显示菜单的新代码如下:

NSMenu *defMenu = [[[NSMenu alloc] initWithTitle:@"default Contextual Menu"] autorelease];

[defMenu insertItemWithTitle:@"Open" action:@selector(openFile) keyEquivalent:@"" atIndex:0];

[defMenu insertItemWithTitle:@"Delete" action:@selector(deleteFile) keyEquivalent:@"" atIndex:1];

return defMenu;

和deleteFile和openFile的函数声明如下:

-(int)openFile;

-(int)deleteFile;

我打电话给我的上下文菜单如下:

-(void)doSingleClick 
{

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

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

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

        return;
    }

}

我的上下文菜单项都是阴影,无法点击。请问你能告诉我哪里出错了。

由于

2 个答案:

答案 0 :(得分:1)

您无法定义此类操作。动作是一种方法,它接受一个表示触发动作消息的对象的对象参数。您需要在控制器中创建一个调用底层openFile:方法的操作。

答案 1 :(得分:1)

您的openFile:方法将int作为参数。由于insertItemWithTitle:action:withObject:keyEquivalent:atIndex:采用对象,因此您提供的选择器也必须采用对象。

您可以使用NSNumber将int包装为对象,只需将openFile:方法更改为NSNumber而不是int。像这样:

[defMenu insertItemWithTitle:@"Open" action:@selector(openFile:) withObject:[NSNumber numberWithInt:5] keyEquivalent:@"" atIndex:0];

- (void)openFile:(NSNumber *)fileNumber {
    int rowClicked = [fileNumber intValue];
    // Do whatever your old method did here
}

编辑:要回答您更新的问题:

您的菜单项被禁用的原因是您只告诉他们要调用的方法名称。你从来没有告诉哪些对象实例实际上应该调用那些方法。要解决此问题,您需要设置项目的目标:

NSMenuItem *openItem = [defMenu insertItemWithTitle:@"Open" action:@selector(openFile:) withObject:[NSNumber numberWithInt:5] keyEquivalent:@"" atIndex:0];
[openItem setTarget:self];

对于你得到的每件物品都是如此。