2012-01-05 18 views
6

Ho un NSMenuItem con un gruppo di elementi al suo interno, tuttavia ... l'elenco non viene abilitato.NSMenuItem abilita gli articoli

quello che voglio dire:
List

Questo è il mio codice:

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

} 

io pongo tutto come consentito, ma è ancora disattivato. Come posso risolvere questo?

risposta

12

Quando si crea un NSMenuItem, l'oggetto deve avere una destinazione valida e un selettore valido. Ciò significa che l'obiettivo non può essere nullo e deve rispondere al selettore passato. Tieni presente che in questo caso un selettore NULL non abiliterà la voce di 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: ho visto che si sta chiamando -[NSMenuItem setEnabled:] con YES dopo aver creato la voce di menu. Questo non è necessario, in quanto saranno abilitati di default.

MODIFICA 2: Come indicato da NSGod (vedere commento sotto), il target può essere nullo. In tal caso il primo risponditore dell'applicazione riceverà il metodo passato. Cioè, finché il primo soccorritore ha implementato quel metodo. (modifica 3) Tuttavia, se questo non è il caso, il metodo verrà inviato al successivo risponditore nella catena di risposta. Questo continua fino a quando non viene trovato un risponditore che risponde al selettore o non ci sono risposte da esaminare. Quando non viene trovato nessun risponditore, la voce del menu non verrà abilitata.

+4

Mentre le voci di menu hanno bisogno di un selettore valido, non devono necessariamente avere un obiettivo (in altre parole, il target ** può ** essere 'nil'). Un obiettivo 'nil' significa" utilizzare il primo oggetto nella catena di risposta che risponde al mio selettore ". È funzionalmente equivalente all'impostazione della destinazione della voce di menu sull'oggetto proxy 'First Responder' nel file pennino. (Vedi http://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/MenuList/Articles/EnablingMenuItems.html#//apple_ref/doc/uid/20000261-74653-BAJBGJHB) – NSGod

+0

Aha! Stavo già pensando perché diavolo il metodo di inizializzazione non ha un argomento obiettivo. Grazie per averlo chiarito! – v1Axvw

+3

La tua seconda modifica non è ancora completamente corretta: il primo risponditore riceverà il messaggio di azione, ma non è necessario implementarlo. In caso contrario, inoltrerà il messaggio al suo prossimo risponditore. Questa è la catena di risposta al lavoro. –

Problemi correlati