2011-02-06 8 views

Respuesta

6

Bueno, terminé pensando en esto, pero me llevó un montón de investigación, así que voy a publicar los detalles aquí en caso de que alguien más se encuentre con el mismo problema. En primer lugar, algunos conceptos básicos:

  1. Es imposible tener 2 ventanas en realidad ser clave a la vez
  2. Es posible una ventana falsa en el pensamiento de que es clave reemplazando -isKeyWindow pero eso no va a dar la vistas contenidas en el estado de la primera respuesta de la ventana.

Mi Escenario:

he añadido una ventana secundaria que contiene un NSTableView en la ventana principal de la aplicación (la razón es irrelavant). La ventana secundaria era NSPanel con NSBorderlessWindowMask. Quería dar el estado de primera respuesta NSTableView sin hacer que el panel sea la ventana clave porque quitó el foco de la ventana principal (y el objetivo de la ventana infantil era hacer que la ventana hija se viera como si fuera parte de la ventana principal))

Lo primero que intenté fue engañar a la vista de tabla para que pensara que estaba dentro de la ventana clave al anular isKeyWindow para devolver YES. Esto hizo que la vista de tabla dibujara como si fuera la primera respuesta, pero aún así no le dio el estado de primera respuesta.

La solución:

Así por defecto, NSBorderlessWindowMask no permitirá que la ventana se convierta en la clave. Para que la vista de tabla sea la primera respuesta, la ventana debe ser clave, de modo que sobreescribo canBecomeKeyWindow en la subclase de la ventana sin bordes para devolver YES. Esto, por supuesto, eliminó el estado clave de la ventana principal, que era una de las cosas que quería evitar. Para solucionar esto, una subclase mi principal ventana y hizo caso omiso de los métodos siguientes:

- (BOOL)isMainWindow 
{ 
    return YES; 
} 

- (BOOL)isKeyWindow 
{ 
    return ([NSApp isActive]) ? YES : [super isKeyWindow]; 
} 

cheques Esta subclase si la aplicación está activa, y si lo es, siempre devuelve YES por lo que no importa qué ventana está activa en su aplicación, la ventana principal siempre se comportará como si todavía fuera la clave. Esto da la ilusión de que puede tener varias ventanas clave al mismo tiempo y le permite cambiar el estado de la ventana clave a otra ventana sin perderlo en la ventana principal. ¡Espero que esto ayude!

+0

Awesome answer. Guardado mi mañana. ¡Gracias! –

+0

¿Es posible que esta solución ya no funcione usando 10.8? – tungsten

+0

¿Qué quiere decir con "no funciona"? –

Cuestiones relacionadas