2012-01-05 19 views
6

Mam NSMenuItem z wiązką elementów w nim, jednak ... lista nie jest włączona.NSMenuItem włącz elementy

Co to znaczy:
List

To jest mój kod:

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

} 

ja ustawiania wszystko jako włączona, ale jest to nadal wyłączona. Jak mogę to rozwiązać?

Odpowiedz

12

Gdy utworzysz NSMenuItem Twój przedmiot będzie musiał mieć prawidłowy cel i prawidłowy selektor. Oznacza to, że cel nie może być zerowy i musi odpowiadać przekazanemu selektorowi. Należy pamiętać, że w tym przypadku selektor NULL nie włączy elementu menu.

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: Widziałem dzwonisz -[NSMenuItem setEnabled:] z YES po utworzeniu elementu menu. Nie jest to konieczne, ponieważ będą one domyślnie włączone.

EDIT 2: Jak zauważył NSGod (patrz komentarz poniżej) cel może być zerowy. W takim przypadku pierwszy respondent Twojej aplikacji otrzyma przekazaną metodę. Oznacza to, że tak długo, jak pierwszy responder ma tę metodę zaimplementowaną. (edycja 3) Jeśli jednak tak nie jest, metoda zostanie wysłana do następnego respondenta w łańcuchu respondenta. Jest to kontynuowane do momentu znalezienia odpowiedzi, która odpowiada na selektor lub gdy nie ma już respondentów do zbadania. Gdy nie zostanie znaleziony żaden responder, pozycja menu nie zostanie włączona.

+4

Podczas gdy pozycje menu wymagają poprawnego selektora, niekoniecznie muszą mieć cel (innymi słowy, cel ** może ** wynosić "zero"). Cel 'nil' oznacza" użyj pierwszego obiektu w łańcuchu respondenta, który odpowiada na mój selektor ". Jest to funkcjonalnie równoważne ustawieniu celu elementu menu na obiekt proxy 'First Responder' w pliku nib. (Zobacz http://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/MenuList/Articles/EnablingMenuItems.html#//apple_ref/doc/uid/20000261-74653-BAJBGJHB) – NSGod

+0

Aha! Już myślałem o tym, dlaczego do cholery metoda inicjalizacji nie ma argumentu docelowego. Dzięki za wyczyszczenie tego! – v1Axvw

+3

Twoja druga edycja wciąż nie jest całkowicie poprawna: pierwszy responder otrzyma wiadomość o akcji, ale nie musi jej implementować. Jeśli nie, przekazuje wiadomość do następnego respondenta. To jest łańcuch odpowiadający w pracy. –