2012-09-19 8 views
5

Ho creato una nuova applicazione standard vuota utilizzando il modello Xcode. Rimosso la finestra in MainMenu.xib e ho creato una nuova sottoclasse NSWindowController personalizzata con uno xib.Come utilizzare NSWindowController per mostrare una finestra nell'applicazione standard?

Sono stati denominati "WYSunFlowerWindowController.h" e "WYSunFlowerWindowController.m".

E io aggiungerà poi la funzione init come di seguito:

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

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

E il mio file WYAppDelegate.m è come di seguito:

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]; 
} 

E io ho il problema, che la finestra non può mostrare da solo dopo aver lanciato l'app. Qualcuno può dirmi perché? Qualcosa non va nel mio codice?

Sono un novizio in Objective-C e cacao. Quindi penso di fare un errore stupido che non riesco a capire da solo.

UPDATE:

Qui è la mia fonte di progetto. Motivi hanno un aspetto e mi aiutano a capire che cosa è il mio errore.

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

+0

Hai attivato ARC? Ho scoperto che con ARC il controllore della finestra viene deallocato a meno che non ne faccia una proprietà del Delegato app (sono sicuro che ci sono altri modi per farlo). – sosborn

+0

Sto usando ARC. Rendo WindowController come un campo statico della classe AppDelegate. Penso che non sarà deallocato fino a quando l'app non verrà terminata. – morphinewan

risposta

2

nel metodo init, io penso che si debba impostare sé al primo super init prima di tornare di sé.

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

Edit:

Prova sostituire makeKeyAndOrderFront: con [windowController showWindow:self]

Poi se questo ancora non funziona, controllare il controller finestra XI ter, accertarsi che il proprietario del file è impostato su WYSunFlowerWindowController e che la finestra IBOutlet (dichiarata in NSWindowController) è connessa alla finestra.

Edit 2:

Commentando la vostra @property e @synthesize finestra nel vostro controller è il trucco. Non dichiarare nuovamente get e setter che erano già predefiniti in una superclasse.

+0

grazie per il vostro aiuto. Ho seguito le tue istruzioni e nulla è cambiato. Ancora non funziona. – morphinewan

+0

Ho fatto tutto ciò che hai menzionato. Non funziona. Non ti dispiace puoi scaricare la mia fonte di progetto per dare un'occhiata? https://dl.dropbox.com/u/3193707/SunFlower.zip – morphinewan

+0

Oh mio Dio, funziona! Grazie mille. Ma sono confuso dal fatto che una proprietà di window outlet definita in sottoclasse causi questo problema? Non possono sovrascrivere la stessa proprietà del genitore della classe? – morphinewan

Problemi correlati