NSMenuItem включить элементы - PullRequest
7 голосов
/ 06 января 2012

У меня есть NSMenuItem с кучей элементов, однако ... список просто не включается.

Что я имею в виду:List

Это мой код:

- (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];

}

Я устанавливаю все как включенное, но оно все еще отключено.Как я могу решить это?

1 Ответ

12 голосов
/ 06 января 2012

Когда вы создаете 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) Однако, если это не так, метод будет отправлен следующему респонденту в цепочке респондентов.Это продолжается до тех пор, пока не будет найден респондент, который отвечает на селектор, или пока не останется респондентов, чтобы исследовать.Если ответчик не найден, пункт меню не будет включен.

...