2013-07-24 14 views
5

Recentemente ho iniziato a studiare Objective-C e ho incontrato un piccolo problema. Sto cercando di utilizzare un controller di visualizzazione personalizzato senza pennino, quindi la vista viene creata nel codice. Il controller di visualizzazione stesso viene creato in AppDelegate.Creazione di un NSViewController personalizzato senza pennino

Quando si esegue il programma, per prima cosa viene visualizzata una finestra vuota predefinita. Dopo aver chiuso questa finestra, viene visualizzata una seconda finestra che contiene correttamente la vista. Ovviamente non voglio che appaia la prima finestra, ma non so cosa lo causi. L'unica informazione che ho trovato su questo argomento è stata per lo sviluppo di iOS, che non è esattamente la stessa cosa.

Inoltre ottengo questo messaggio di cui io non sono davvero sicuro che cosa significa: Impossibile collegare l'orderFrontStandardAboutPanel azione: a bersaglio di classe MainViewController

AppDelegate:

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification 
{ 
    mainViewController = [[MainViewController alloc] initWithFrame:_window.frame]; 
    _window.contentView = mainViewController.view; 
} 

MainViewController:

- (id)initWithFrame:(NSRect)frame 
{ 
    self = [super initWithNibName:nil bundle:nil]; 
    if (self) 
    { 
     [self setView:[[MainView alloc] initWithFrame:frame]]; 
     [self loadView]; 
    } 
    return self; 
} 
+1

Immagino che tu stia chiamando loadview 2 volte. 2. loadview esplicitamente. Lo scopo di -loadView è, uh, caricare la vista. Viene chiamato quando si accede alla proprietà della vista del controller della vista e il valore di tale proprietà è nullo. In questo caso, si accede a SetView autonomo nel proprio inizializzatore, quindi è quando viene chiamato loadView. Anche in questo caso stai chiamando loadView in modo specifico. Questa potrebbe essere una delle ragioni per cui vedi la prima volta vuota o mentre iOS sta caricando la tua applicazione per visualizzare l'immagine di caricamento. – Srivathsa

+0

Ecco cosa l'ha causato, grazie! – user2616316

+0

Ok, è stato bello risolvere il tuo problema. Quindi puoi fare un voto per il mio commento. – Srivathsa

risposta

14

In breve, override loadView e impostare self.view al proprio punto di vista. Ti consigliamo di dargli una cornice prima di impostarla.

L'implementazione predefinita di loadView è dove si tenta di caricare il pennino. Hai intenzione di scavalcare questo se non lo vuoi.

+0

Questo non funziona. Si blocca con un cattivo accesso ogni volta che provo a dargli un frame –

+0

@JackyWang Funziona. Devi dichiarare un oggetto 'NSView' dentro' loadView', quindi impostare il frame di quell'oggetto, quindi impostare 'self.view' sul tuo nuovo oggetto vista. In altre parole, ** mai ** usa 'self.view.anything' all'interno di' loadView' perché 'self.view' non esiste ancora. – Mahouk

Problemi correlati