2009-12-07 11 views
7

Específicamente, se comporta de forma incoherente con respecto al campo de texto de enfoque.LSUIElement se comporta de forma incoherente con activateIgnoringOtherApps

Tengo un LSUIElement que muestra un menú de estado. Dentro de ese menú hay una vista que contiene un campo de texto. El campo de texto debe ser seleccionable, no necesariamente seleccionado de manera predeterminada, sino cualquiera que sea.

Cuando se hace clic en el elemento de estado, se dispara

[NSApp activateIgnoringOtherApps:YES]; 

Y funciona, aproximadamente la mitad del tiempo. * La otra mitad del menú de estado parece considerarse a sí misma "en el fondo" y no va a dejar me enfoco en el campo de texto incluso haciendo clic en él. (Sé que el disparador de clic de elemento de estado está disparando b/c hay un NSLog en él.)

¿Esto es un error en la forma en que Apple maneja estos elementos de estado, o estoy manejando mal activateIgnoringOtherApps?

* De hecho, parece fallar solo la primera vez que se activa otra aplicación. Después de eso, funciona bien.

El fragmento completo:

-(void)statusItemClicked:(id)sender { 
    //show the popup menu associated with the status item. 
    [statusItem popUpStatusItemMenu:statusMenu]; 

    //activate *after* showing the popup menu to obtain focus for the text field. 
    [NSApp activateIgnoringOtherApps:YES]; 

} 

Respuesta

0

sé por experiencia que usted tiene que llamar activateIgnoringOtherApps: después de que haya aparecido el menú que contiene el campo de texto. Por lo que tendría que hacerlo en este orden:

- (void)statusItemClicked:sender { 
    [statusItem popUpStatusItemMenu:theMenu]; 
    [NSApp activateIgnoringOtherApps:YES]; // FYI, NSApp is shorthand for [NSApplication sharedApplication] 
} 

Sobre la base de lo que has dicho, parece que su aplicación está activando demasiado tarde, por lo que no está consiguiendo activa la primera vez que hace clic en el elemento , pero ya está activado en clics posteriores.

+0

Definitivamente se está activando demasiado tarde, pero el código ya estaba estructurado como sugieres. Casi parece que el método de activación no se llama hasta que el menú de estado haya sido descartado (las pruebas de NSLog parecen confirmar esto). No entiendo por qué estaría sucediendo eso. – iconmaster

+0

Entonces, 'activateIgnoringOtherApps:' recibe una llamada inmediatamente después de 'popUpStatusItemMenu:', o no regresa ese método hasta que se cierra el menú? Puede intentar establecer un punto de interrupción y ejecutar el depurador para ver qué sucede. – Alex

+0

Sí, utilizando puntos de interrupción definitivamente se llama solo después de que el menú se descarta. Agregando mi código a la primera publicación, aunque se ve casi exactamente como su sugerencia. – iconmaster

2

Finalmente surgió una solución para esto.

En lugar de aparecer el menú en su controlador de clic, activar la aplicación y luego programar una NSTimer sin retraso que aparece en el menú:

-(void)pop:(NSTimer *)timer { 
    [statusItem popUpStatusItemMenu:theMenu]; 
} 

-(void)statusItemClicked:sender { 
    [NSApp activateIgnoringOtherApps:YES]; 
    [NSTimer scheduledTimerWithTimeInterval:0.0 target:self selector:@selector(pop:) userInfo:nil repeats:NO]; 
} 

pop: se llama en el siguiente fotograma lo que el retraso es imperceptible, pero a largo suficiente para activateIgnoringOtherApps: para hacer lo que sea que le impedía funcionar como se esperaba al abrir el menú en el mismo marco.

Cuestiones relacionadas