2010-05-30 13 views
5

Necesito generar una ventana que se colocará justo encima de la ventana principal en una aplicación de cacao. Quiero que esta ventana principal permita al usuario ingresar texto en un cuadro de entrada. Todo está bien hasta que el cuadro de entrada de texto en realidad gana foco. La ventana principal se vuelve "desactivada". Esta ventana no tiene bordes y es una forma ligeramente personalizada, es más como una carta flotante que otra cosa, supongo.Cocoa/Objective-C - Ventana secundaria con entrada de texto sin ventana principal inactiva

Básicamente, me gustaría que esto funcionara casi exactamente como Spotlight (Apple + Space) - puede ingresar texto, pero esta es una operación tan auxiliar que en el contexto de la mayor UX, no lo hace t desea que el efecto discordante de la ventana principal se cangreje (se vuelva inactivo). Notará que cuando tiene alguna aplicación abierta y enfocada, Spotlight no hará que la ventana de esa aplicación se vuelva inactiva.

Este problema surge porque la entrada de texto parece REQUERIR que la ventana secundaria se convierta en la ventana clave (no le permitirá colocar el cursor en el campo de entrada de texto). Cuando se convierte en clave, la ventana principal se vuelve inactiva.

Hasta ahora he tratado:

  • subclases NSWindow para mi aplicación principal y primordial isKeyWindow tal que sólo pierde clave cuando la aplicación ya no se centran los usuarios (en contraposición a la ventana) es. Esto tuvo el efecto involuntario de colisionar con el estado de la clave de la ventana secundaria y tener efectos muy extraños en la entrada del teclado (algunas teclas no se capturan, como eliminar)
  • Crear una vista en lugar de una ventana. No funciona debido al problema this; no se puede dibujar sobre Webkit WebView en estos días.

Anybody Cocoa/OSX wizards tienen alguna idea? Me he vuelto un poco obsesionado con este. Un picor que no puedo rascar.

Editar: también han intentado anular lo siguiente en la ventana secundaria. Cuando se hace clic, la ventana hace que la ventana principal de la aplicación se vuelva inactiva.

- (BOOL)canBecomeKeyWindow { 
    return YES; 
} 

- (BOOL)canBecomeMainWindow { 
    return NO; 
} 

Edición 2: Después de enroscar sobre la NSMenu por un tiempo, lo desechó ese enfoque. Parece que encontré algo, sin embargo. En NSPanel hay una máscara de estilo de ventana llamada:

NSNonactivatingPanelMask 
The panel can receive keyboard input without activating the owning application. 
Valid only for an instance of NSPanel or its subclasses; not valid for a window. 

intentar esto ahora ...

Datos 3: NSNonactivatingPanelMask no hizo el truco. Sin ideas.

+0

¿Alguna vez encontró una solución para esto? Lo siento, lo habría contactado por correo electrónico, pero parece que su sitio no funciona. – Wesley

Respuesta

0

Lo que quiere es una ventana que puede convertirse en key window pero que no puede convertirse en main window. Podrías implementar tal clase tú mismo, pero esto es básicamente para lo que NSPanel es, así que puedes probarlo primero.

+0

Intenté eso también. Déjame ver si no puedo desenterrar el código. No puedo recordar si el problema fue que cuando anulé -canBecomeMain para devolver NO, no pareció hacer ninguna diferencia en absoluto, o no pude ingresar texto. – Josh

+0

Además, probado NSPanel, no tuvo tanta suerte. De nuevo, déjame ver si no puedo desenterrar el código.Tuve que hacer una copia de seguridad/desecharlo para revisión/registro de código – Josh

+0

Después de desenterrar el código, he agregado lo que he probado. Permite que la entrada de texto con -canBecomeMain devuelva NO, pero aún así simplemente desactiva la ventana principal. Es una vista de webkit en la ventana secundaria ... Me pregunto si webview arroja una vez más una basura en el punchbowl aquí. – Josh

0

Creo que esto puede ayudarlo: [self.childWindow makeKeyAndOrderFront: self];

Cuestiones relacionadas