2011-06-10 16 views
13

Tengo un NSMenuItem que necesito actualizar para mostrar un progreso (como hace Time Machine con su copia de seguridad). El problema es que cuando configuro un nuevo title en ese NSMenuItem y el title no cambia.Actualizar NSMenuItem mientras se muestra el menú del host

De hecho, está cambiando cuando cierro y vuelvo a abrir el menú, pero quiero actualizarlo mientras el usuario lo está mirando.

También intenté eliminar un artículo y volver a insertarlo sin ningún resultado.

¿Alguna sugerencia?

Respuesta

18

Esto realmente funciona sin esfuerzo adicional si su código de actualización se ejecuta en el run loop mode que se utiliza durante el seguimiento del menú. Esto es NSEventTrackingRunLoopMode, pero probablemente solo quiera usar NSRunLoopCommonModes para que el título del elemento del menú sea correcto cuando se baja el menú.

Aquí está un ejemplo sencillo de un elemento de menú foo que cuenta el número de segundos desde la aplicación lanzada:

- (void)doStuff; 
{ 
    static int i = 0; 
    [foo setTitle:[NSString stringWithFormat:@"%d", ++i]]; 
} 

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification; 
{ 
    NSInvocation *invocation = [NSInvocation invocationWithMethodSignature: 
           [self methodSignatureForSelector:@selector(doStuff)]]; 
    [invocation setTarget:self]; 
    [invocation setSelector:@selector(doStuff)]; 
    [[NSRunLoop mainRunLoop] addTimer:[NSTimer timerWithTimeInterval:1 invocation:invocation repeats:YES] forMode:NSRunLoopCommonModes]; 
} 
+0

respuesta muy valiosa. Este es un problema muy común para la gente la primera vez que encuentran el menú runloop. –

+0

Tiene toda la razón Nicholas, intentaba hacerlo con 'performSelector: afterDelay:' que se ejecuta en 'NSDefaultRunLoopMode'. Muchas gracias por tu respuesta. – gcamp

Cuestiones relacionadas