我有一个带有大量项目的NSMenuItem,但是......列表没有启用。
我的意思是:
这是我的代码:
- (void)didFetchNewList:(NSArray *)list
{
NSArray *smallList = [list subarrayWithRange:NSMakeRange(0, 10)];
NSMenu *menu = [[NSMenu alloc] initWithTitle:@""];
for (NSDictionary *dict in smallList)
{
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"MMM dd @ HH:mm:ss"];
NSMenuItem *soMenuItem = [[NSMenuItem alloc] initWithTitle:
[dateFormatter stringFromDate:[dict objectForKey:@"date"]]
action:nil
keyEquivalent:@""];
[soMenuItem setEnabled:YES];
[menu addItem:soMenuItem];
}
[menu addItem:[NSMenuItem separatorItem]];
NSMenuItem *soMenuItem = [[NSMenuItem alloc]
initWithTitle:@"Settings" action:nil keyEquivalent:@"S"];
[soMenuItem setEnabled:YES];
[menu addItem:soMenuItem];
[statusItem setMenu:menu];
[statusItem setEnabled:YES];
}
我将所有内容设置为已启用,但仍处于禁用状态。我该如何解决这个问题?
答案 0 :(得分:12)
创建NSMenuItem
时,您的项目必须具有有效目标和有效选择器。这意味着目标不能为零,并且必须响应传递的选择器。请记住,在这种情况下,NULL选择器不会启用菜单项。
NSMenu *myMenu;
NSMenuItem *myItem;
myMenu = [[NSMenu alloc] initWithTitle:@""];
myItem = [[NSMenuItem alloc] initWithTitle:@"Test" action:@selector(validSelector:) keyEquivalent:@""];
[myItem setTarget:myTarget];
[myMenu addItem:myItem];
// Do anything you like
[myMenu release];
[myItem release];
编辑:在创建菜单项后,我看到您正在使用-[NSMenuItem setEnabled:]
呼叫YES
。这不是必需的,因为它们将默认启用。
编辑2:正如NSGod指出的那样(见下面的评论),目标可以是零。在这种情况下,您的应用程序的第一个响应者将收到传递的方法。也就是说,只要第一响应者实施了该方法。 (编辑3)但是,如果不是这种情况,则该方法将被发送到响应者链中的下一个响应者。这将一直持续到发现响应者响应选择器或者没有响应者需要检查。如果没有找到响应者,则菜单项将无法启用。