0

我有问题。我的上下文菜单正在显示,但菜单项未激活。所以我显示菜单的新代码如下:

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;
    }

}

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

谢谢

4

2 回答 2

1

你不能定义这样的动作。动作是一种方法,它采用一个对象参数来表示触发动作消息的对象。您需要在控制器中创建一个调用底层 openFile: 方法的操作。

于 2009-08-31T22:50:02.253 回答
1

您的openFile:方法将 int 作为参数。由于insertItemWithTitle:action:withObject:keyEquivalent:atIndex:需要一个对象,因此您给它的选择器也必须接受一个对象。

您可以使用NSNumber将您的 int 包装为一个对象,并简单地将您的openFile:方法更改为采用 anNSNumber而不是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];

对于您拥有的每个项目,依此类推。

于 2009-08-31T23:32:19.547 回答