2011-09-18 7 views
16

makeKeyAndOrderFront no está haciendo mi NSWindow key o front.NSWindow makeKeyAndOrderFront hace que aparezca la ventana, pero no Key o Front

Mi aplicación no tiene una ventana principal o una barra de menú, ¿cuál puede ser la causa del problema?

IBOutlet NSWindow *loginWindow; 
//(connected in Interface Builder to the NSWindow) 

NSWindow tiene "visible en el inicio" y "suelta cuando está cerrado" ambos desmarcados.

continuación:

- (void) applicationDidFinishLaunching:(NSNotification *)aNotification 
{ 
    [loginWindow makeKeyAndOrderFront:self]; 
} 

Esto hace abrir la ventana. (comentarlo da como resultado que no se abra ninguna ventana).

Sin embargo:

  • aparece detrás de la ventana Xcode (no frontal).

  • Parece que recibe el enfoque del mouse, pero no presiona las teclas en los campos de texto que contiene la ventana. Las pulsaciones de teclas se envían a Xcode.

  • Aparece en la cuadrícula Exponer cuando se activa Exponer. Pero no puedo hacer clic en la ventana para seleccionarla en Exponer ... no pasará al frente.

¿Por qué no funciona mi ventana?

+1

No es necesario que las aplicaciones tengan una "ventana principal", o ninguna ventana específica de la aplicación, ni un menú principal (aunque siempre deben tener una menú principal: muchos comandos de teclado vienen gratis de esa manera, incluso si la aplicación no usa la barra de menú). Cualquier ventana que tenga el aspecto activo es la ventana principal en la terminología de Cocoa; más importante aún, es completamente válido para una aplicación que no tenga ventanas, como lo demuestran todas las aplicaciones basadas en documentos, aplicaciones de solo fondo y elementos de UI. –

Respuesta

23

Puñalada en la oscuridad: Tiene LSBackgroundOnly establecido en su Info.plist. Eso es lo que hace que esto no funcione: una aplicación de solo fondo no puede pasar al primer plano, por lo que su ventana no pasa a primer plano.

Si desea que su aplicación no se muestre en el Dock, configure LSUIElement en su lugar. Esto suprime el mosaico del Dock de la aplicación y evita que muestre su propio menú principal en la barra de menú, pero conserva su capacidad de acercar una ventana y convertirla en la clave.

+0

Sí, 'LSUIElement' lo arregla. Estaba usando 'NSBGOnly', que ahora parece estar en desuso. – cksubs

+2

@cksubs: Sí: 'NSBGOnly' fue renombrado como' LSBackgroundOnly'. Solo el antiguo nombre está en desuso; 'LSUIElement' y' LSBackgroundOnly' son ambos actuales, pero hacen cosas diferentes. Estas y todas las demás claves actuales están documentadas en la Referencia clave de la lista de propiedades de información: http://developer.apple.com/library/mac/documentation/General/Reference/InfoPlistKeyReference/ –

29

Intente llamar a este método [NSApp activateIgnoringOtherApps:YES];. Esto debería convertirlo en la aplicación activa.

+0

Exactamente como usted escribió? ¿O debo sustituir una variable por 'NSApp'? Pegado como está, arriba de la línea 'makeKeyAndOrderFront', no hay cambios. Exactamente el mismo comportamiento que describí anteriormente. – cksubs

+0

@cksubs: 'NSApp' es una variable; no necesitas cambiarloEsto debería resolver su problema inmediato (la aplicación no está en primer plano), pero no debería ser necesario (la aplicación debería haber llegado al frente automáticamente como parte de Xcode al iniciarla). –

+2

P.S. De hecho, terminé necesitando usar este comando 'activateIgnoringOtherApps', además de agregar' LSUIElement' al Info.plist. – cksubs

0

Ambas respuestas son correctas. También deberá asegurarse de anular canBecomeKey en su subclase de ventana si no tiene bordes.

Esto tomó ser para siempre para descubrir. (Escribí un blog post sobre la totalidad de mi solución.)

Cuestiones relacionadas