objective-c – NSMenuItem启用项目

我有一个带有大量项目的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];

}

我将所有内容设置为已启用,但仍处于禁用状态.我怎么解决这个问题?

解决方法

创建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)但是如果不是这种情况,该方法将被发送到响应者链中的下一个响应者.这将一直持续到发现响应者响应选择器或者没有响应者需要检查.如果未找到响应者,则不会启用菜单项.

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...