2012-09-19 13 views
5

Creé una nueva aplicación estándar en blanco usando la plantilla de Xcode. Se eliminó la ventana en MainMenu.xib y creé una nueva subclase NSWindowController personalizada con un xib.¿Cómo se usa NSWindowController para mostrar una ventana en la aplicación estándar?

Se denominaron "WYSunFlowerWindowController.h" y "WYSunFlowerWindowController.m".

Y a continuación, añadir la función init, como a continuación:

- (id)init 
{ 
    NSLog(@"init()"); 

    return [super initWithWindowNibName:@"WYSunFlowerWindowController" owner:self]; 
} 

Y mi archivo WYAppDelegate.m es como a continuación:

static WYSunFlowerMainWindowController* windowController = nil; 

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification 
{ 
    // Insert code here to initialize your application 
    if (windowController == nil) { 
     windowController = [[WYSunFlowerMainWindowController alloc] init]; 
    } 
    [[windowController window] makeKeyAndOrderFront:windowController]; 
} 

y tengo el problema, que la ventana no se puede mostrar yo mismo después de que inicie la aplicación. ¿Alguien puede decirme por qué? ¿Hay algún problema con mi código?

Soy un novato en Objective-C y cocoa. Así que creo que tal vez cometer un error tonto que no puedo resolver por mi cuenta.

ACTUALIZACIÓN:

Aquí es mi fuente del proyecto. Peticiones tienen un aspecto y me ayudan a averiguar qué es mi error.

https://dl.dropbox.com/u/3193707/SunFlower.zip

+0

¿Tiene ARC habilitado? Descubrí que con ARC, el controlador de ventana se desasigna a menos que lo haga una propiedad del delegado de la aplicación (estoy seguro de que hay otras formas de hacerlo). – sosborn

+0

Estoy usando ARC. Hago windowController como un campo estático de la clase AppDelegate. Creo que no se desasignará hasta que se finalice la aplicación. – morphinewan

Respuesta

2

En el método init, yo creo que hay que establecer auto a la primera súper init antes de regresar a uno mismo.

-(id)init 
{ 
    NSLog (@"init()"); 
    self = [super initWithWindowNibName:@"WYSunFlowerWindowController" owners:self]; 
    return self; 
} 

Editar:

Trate de sustituir makeKeyAndOrderFront: con [windowController showWindow:self]

Entonces, si aún así no funciona, compruebe el controlador de ventana xib, asegúrese de que el propietario del archivo se establece en WYSunFlowerWindowController y que la ventana IBOutlet (declarada en NSWindowController) está conectada a la ventana.

Edición 2:

Comentando su @property y @synthesize ventana en su controlador era el truco. No redeclare get y setters que ya estaban predefinidos en una superclase.

+0

gracias por su ayuda. Seguí tus instrucciones y nada cambió. Aún no funciona – morphinewan

+0

He hecho todo lo que mencionaste. No trabajo. ¿No te importa que puedas descargar mi fuente del proyecto para echar un vistazo? https://dl.dropbox.com/u/3193707/SunFlower.zip – morphinewan

+0

¡Dios mío, funciona! Muchas gracias. Pero estoy confundido acerca de por qué una propiedad de salida de ventana definida en la subclase causará este problema. ¿No pueden anular la misma propiedad del padre de la clase? – morphinewan

Cuestiones relacionadas