2012-01-05 3 views
6

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

Что я имею в виду:
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]; 

} 

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

ответ

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

EDIT: Я видел, что вы звоните -[NSMenuItem setEnabled:] с YES после создания пункта меню. Это не обязательно, поскольку они будут включены по умолчанию.

EDIT 2: Как указал NSGod (см. Комментарий ниже), цель может быть равна нулю. В этом случае первый ответчик вашего приложения получит пройденный метод. То есть, до тех пор, пока первый ответчик реализует этот метод. (edit 3) Однако, если это не так, метод будет отправлен следующему ответчику в цепочке ответчиков. Это продолжается до тех пор, пока не будет обнаружен ответчик, который реагирует на селектор, или нет респондентов, оставшихся на рассмотрении. Когда никакой ответчик не обнаружен, пункт меню не будет включен.

+4

Хотя пункты меню действительно имеют действительный селектор, они необязательно должны иметь цель (другими словами, цель ** может быть «nil»). Цель «nil» означает «использовать первый объект в цепочке ответчиков, который отвечает на мой селектор». Он функционально эквивалентен установке цели элемента меню в прокси-сервер «Первый ответчик» в файле nib. (См. Http://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/MenuList/Articles/EnablingMenuItems.html#//apple_ref/doc/uid/20000261-74653-BAJBGJHB) – NSGod

+0

Ага! Я уже думал о том, почему, черт возьми, у метода инициализации нет целевого аргумента. Спасибо, что поняли! – v1Axvw

+3

Ваше второе редактирование все еще не совсем правильно: первый ответчик получит сообщение о действии, но ему не нужно его реализовывать. Если этого не произойдет, он отправит сообщение своему следующему ответчику. Это цепочка ответчиков на работе. –

Смежные вопросы