我遇到了问题。我的上下文菜单显示但菜单项未激活。 所以我显示菜单的新代码如下:
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;
}
}
我的上下文菜单项都是阴影,无法点击。请问你能告诉我哪里出错了。
由于
答案 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];
对于你得到的每件物品都是如此。