2010-03-11 8 views
5

En mi código a continuación, CustomWindow es una subclase de NSWindow.Puntero a NSWindow Xib después de cargarlo?

CustomWindow *window = [[CustomWindow alloc] init]; 
if (![NSBundle loadNibNamed:@"NibName" owner:window]) 
[window center]; // doesn't work 

¿Cómo se obtiene un puntero a controlar su XI ter después de cargarlo para que pueda hacer las cosas tales como el centrado de la NSWindow (me refiero a la que serializado que reside dentro de la XI ter)?

¿Qué estoy haciendo mal aquí?

Respuesta

16

Debe utilizar una subclase NSWindowController. NSWindowController está específicamente diseñado para hacer exactamente lo que usted desea lograr y resuelve varios problemas que encontrará si carga el plumín directamente usando los métodos de NSBundle. Por lo general, siempre debe usar una subclase NSWindowController para administrar ventanas.

Crear una subclase de NSWindowController:

@interface MyWindowController : NSWindowController {} 
@end 

@implementation MyWindowController 
- (id)init 
{ 
    self = [super initWithWindowNibName:@"MyWindow"]; 
    if(self) 
    { 
     //initialize stuff 
    } 
    return self; 
} 
//this is a simple override of -showWindow: to ensure the window is always centered 
-(IBAction)showWindow:(id)sender 
{ 
    [super showWindow:sender]; 
    [[self window] center]; 
} 
@end 

En Interface Builder, defina la clase de propietario de archivo ser MyWindowController y conecte el window salida del propietario de archivo al objeto de ventana en su punta.

continuación, puede navegar por la ventana al hacer esto:

MyWindowController* controller = [[MyWindowController alloc] init]; 
[controller showWindow:self]; 
+0

Estaba haciendo todo lo que dijiste, excepto "conectar la ventana de salida del propietario del archivo". Una vez que hice eso, todo funcionó. ¡Gracias un montón! +1 y Marque. –

+0

Asegúrese de desmarcar la propiedad 'Restaurable' de la ventana en IB. –

+0

@KeithSmiley ¿Qué editor es la propiedad 'Restaurable', o esto ya no se aplica a Xcode 5.x? –

1

Probablemente no desee hacer de su ventana el propietario del archivo. Normalmente pasaría self o algún objeto controlador allí. Entonces, si self o ese objeto controlador tiene una ventana personalizada IBOutlet, se conectará cuando llame al loadNibNamed:. Consulte this post para obtener un código de ejemplo.

+0

CustomWindow es el objeto controlador. Contiene IBOutlets que se conectan cuando ejecuto la aplicación. Los controles en la ventana funcionan todos. Simplemente no puedo entender cómo centrarlo. –

0

Un XIB es un contenedor para objetos, no es igual a una ventana. No puede centrar un XIB, solo puede centrar una ventana contenida en un XIB.

Además, los objetos en el XIB se crean cuando lo carga. No pasa un objeto como propietario que luego representa uno de los objetos en el XIB, en su lugar utiliza IBOutlets para obtener referencias a los nuevos objetos creados al cargar el XIB y luego puede interactuar con ellos.

El objeto Propietario del archivo es un objeto especial en XIB, ya que es el único objeto que no se crea y que puede especificar pasándolo a loadNibNamed:owner:. Es su puerta de enlace entre los objetos creados por XIB y su aplicación.

Normalmente, el objeto propietario es algún tipo de clase de controlador. Establezca la clase Owner del archivo en Interface Builder en su clase de controlador, luego defina algunos IBOutlets en la clase, se mostrarán en Interface Builder en el propietario del archivo y podrá conectarlos a ellos en el XIB.

Finalmente, cuando pase su objeto controlador a loadNibNamed:owner:, Cocoa conectará sus IBOutlet a los objetos recién creados y podrá usarlos para interactuar con ellos, p. Ej. para centrar una ventana en tu XIB.

+0

Usted describe lo que ya tengo configurado. No hay problemas con IBOutlets y no estoy tratando de obtener un puntero a un XIB. El XIB contiene una NSWindow que quiero un puntero a –

+0

Para eso usas el "Propietario del archivo" en IB. Es un proxy para el objeto que pasa al método loadNibNamed: Ver la otra respuesta. –

+0

Sí, eso es lo que pensé. Resulta que el problema era que no tenía la salida de ventana del propietario del archivo conectada al objeto de la ventana del XIB. –

2

En mi código de abajo, CustomWindow es una subclase de NSWindow.

CustomWindow *window = [[CustomWindow alloc] init]; 
if (![NSBundle loadNibNamed:@"NibName" owner:window]) 
[window center]; // doesn't work 

¿Cómo se obtiene un puntero a controlar su XI ter después de cargarlo para que pueda hacer las cosas tales como el centrado de la NSWindow dentro de la XI ter?

“centrar el NSWindow dentro de la XI ter” no tiene sentido (que sería centrarlo en la pantalla), a menos que decir centrar el objeto NSWindow que está dentro del XI ter, en cuyo caso, ¿por qué estás creando otro objeto NSWindow (CustomWindow) fuera del xib?

Recuerde que una punta (o xib) es un archivo de objetos. Si desea usar una ventana que tiene en su plumilla, necesita crear una salida para apuntar a esa ventana, configurar la clase del Propietario del archivo para que sea la clase en la que ha agregado la salida, conectar la salida en IB, y designe el objeto con la salida como el Propietario del archivo pasándolo al argumento owner:. Ese objeto, como propietario, será responsable de trabajar con la ventana. Puede ser (normalmente es, en mi código) el mismo objeto que carga el plumín.

Además, init no funciona en NSWindow; debe usar initWithContentRect:styleMask:backing:defer: o initWithContentRect:styleMask:backing:defer:screen:. El uso de init solo sería válido si ha implementado init usted mismo en CustomWindow, y usó uno de esos dos selectores para el mensaje [super init…].

Cuestiones relacionadas