2012-01-05 9 views
6

Tengo un NSMenuItem con un montón de elementos, sin embargo ... la lista simplemente no se habilita.NSMenuItem Habilitar elementos

lo que quiero decir:
List

Este es mi código:

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

} 

yo pongo todo como está habilitado, sin embargo, todavía está desactivada. ¿Como puedo resolver esto?

Respuesta

12

Cuando crea un NSMenuItem su artículo tendrá que tener un objetivo válido y un selector válido. Esto significa que el objetivo no puede ser nulo y debe responder al selector pasado. Tenga en cuenta que en este caso un selector NULL no habilitará el elemento del menú.

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: vi que está llamando -[NSMenuItem setEnabled:] con YES después de crear el elemento de menú. Esto no es necesario, ya que estarán habilitados por defecto.

EDIT 2: Como NSGod señaló (ver el comentario a continuación) el objetivo puede ser nulo. En ese caso, el primer respondedor de su aplicación recibirá el método aprobado. Es decir, siempre que el primer respondedor tenga implementado ese método. (edit 3) Sin embargo, si este no es el caso, el método se enviará al siguiente respondedor en la cadena de respuesta. Esto continúa hasta que se encuentra un respondedor que responde al selector o no quedan respondedores para examinar. Cuando no se encuentra el respondedor, el elemento del menú no se habilitará.

+4

Si bien los elementos del menú sí necesitan tener un selector válido, no necesariamente tienen que tener un destino (en otras palabras, el objetivo ** puede ** ser 'nil'). Un objetivo "nil" significa "usar el primer objeto en la cadena de respuesta que responde a mi selector". Es funcionalmente equivalente a establecer el objetivo del elemento de menú al objeto proxy 'Primer Respondedor' en el archivo de punta. (Consulte http://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/MenuList/Articles/EnablingMenuItems.html#//apple_ref/doc/uid/20000261-74653-BAJBGJHB) – NSGod

+0

¡Ajá! Ya estaba pensando por qué demonios el método de inicialización no tiene un argumento objetivo. Gracias por aclarar eso! – v1Axvw

+3

Su segunda edición aún no es totalmente correcta: el primer respondedor recibirá el mensaje de acción, pero no necesita implementarlo. Si no lo hace, reenviará el mensaje a su siguiente respondedor. Esa es la cadena de respuesta en el trabajo. –

Cuestiones relacionadas