7

我有一个 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];

}

我将所有内容都设置为启用,但它仍然被禁用。我该如何解决这个问题?

4

1 回答 1

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)但是,如果不是这种情况,该方法将被发送到响应者链中的下一个响应者。这一直持续到找到响应选择器的响应者或没有响应者可供检查。当没有找到响应者时,您的菜单项将不会启用。

于 2012-01-05T23:49:03.617 回答