2012-04-12 14 views
9

Dopo aver fatto confusione con le app iOS, ho pensato di dare a un'app Cocoa un vortice assumendo che le cose sarebbero state molto simili. Quindi ho una singola app con una vista divisa e alcuni NSTableView s (penso iTunes) e sto cercando un posto dove mettere il mio codice che recupera i dati dal web per riempire le tabelle.(cacao) Qual è l'equivalente di una sottoclasse UIViewController in una singola applicazione cacao a finestra?

In iOS lo inserisco nel metodo viewDidLoad della sottoclasse UIViewController appropriata. Il UITableViewDataSource quindi accedere a questi dati per popolare le sue celle.

Ora ho uno NSWindow per il quale potrei fare una cosa simile ma come faccio a fare un NSWindowController per questo? E 'questo anche quello che voglio? Potrei inserirlo nel AppDelegate ma non sembra giusto.

risposta

12

La differenza tra IOS e OS X è che c'è solo una finestra in IOS ma ci possono essere molteplici in OS X. NSViewControllers in OS X è diverso da quello UIViewControllers dal fatto che la NSViewController è progettato per caricare e gestire un'unica vista, mentre UIViewControllers (mi scuso per la mia relativa mancanza di conoscenza di iOS) sembra gestire più visualizzazioni e fornire molto di più della colla tra le viste.

Anche il Apple docs scrivono che:

In Mac OS X, vista controllori AppKit sono assistenti al controller finestra , che è in definitiva responsabile di tutto ciò che va nella finestra.

Pertanto, la controparte per UIViewController in OS X non è NSViewController, ma piuttosto NSWindowController, che non prevede OS X molto di ciò UIViewController fa per iOS gestendo la totalità di una singola finestra e il layout/contenuti/interazione delle opinioni all'interno.

Nel tuo caso, utilizzerei uno NSWindowController - sebbene l'app sia molto semplice, anche lo App Delegate funziona; e se l'app è molto complessa, quindi utilizzare NSViewController per suddividere il codice non sarebbe una cattiva idea.

Il modo migliore per farlo utilizzare un NSWindowController sarebbe caricare programatically esso in App Delegato utilizzando [[CustomWindowController alloc] init] e

@implementation CustomWindowController 
- (id)init 
{ 
    self=[super initWithWindowNibName:@"CustomWindowNibName"]; 
    if(self) 
    { 
     //perform any initializations 
    } 
    return self; 
} 
@end 

o chiamando

[[CustomWindowController alloc] initWithWindowNibName:@"CustomWindowNibName"]; 

direttamente (e ignorando initWithWindowNibName) se si desidera sarà riutilizzabile.

Ed è possibile eliminare la finestra predefinita in MainMenu.xib.


Fondamentalmente, il più delle volte, un NSWindowController gestisce una finestra di un'istanza in un file pennino. Il NSWindowController di solito possiede quel file di pennini. (Anche se è possibile farlo gestire una finestra creata in modo programmatico, di solito non è così.)

Per poter utilizzare uno standard NSWindowController, è quindi necessario rendere la finestra da gestire. in un file pennino/xib separato.(utilizzando il file xib predefinito si consente a Cocoa di istanziare automaticamente un NSWindowController senza opportunità per la sottoclasse, non è possibile utilizzare un valore personalizzato NSWindowController con il NSMainNibFile predefinito.Per una semplice app, basta inserire tutto il codice del controller nel Delegato dell'applicazione/App NSA)

in Xcode 4, almeno, il processo comporta la creazione di un XI ter con il modello finestra e la classe personalizzata NSWindowController, un'istanza della classe CustomWindowController sulla base di tale pennino in -init o dovunque e quindi chiamando [CustomWindowController showWindow:self]; (o, se ciò non lo fa lavoro, -makeKeyAndOrderFront:) per visualizzare effettivamente la finestra (in - (void)applicationDid/WillFinishLaunching:(NSNotification *)aNotification potrebbe essere un bel posto).

Per interrompere la visualizzazione della finestra predefinita, basta eliminarlo. Probabilmente c'è un modo migliore ma non lo so.

+0

Sì, ho pensato di dover utilizzare un NSWindowController ma non ero sicuro di come collegarlo a NSWindow. Ho trascinato una nuova finestra nel MainMenu.xib e l'ho installata, ma è già in fase di caricamento quando eseguo l'app. Ho anche provato ad usare AppDelegate solo per far partire le cose ma non so come ad es. rendere il mio look NSTableView in AppDelegate.m per i metodi del prototipo NSTableViewDataSource. Ho provato a connetterti dalla tabella a 'File's owner' e selected dataSource ma non riesce con un errore 'NSTable view data source' non valido. – TijuanaKez

+0

Il modo più semplice per collegare NSWindowController è dividere i file pennino e dargli il proprio file da caricare. Quindi crea un nuovo file pennino usando il modello di finestra e imposta il proprietario dei file sul controller. Inoltre, sul tuo tentativo di connettersi a dataSource: "File's Owner" in quel caso era l'NSApplication; vuoi invece trascinare verso il Delegato app. – Vervious

+0

Ok, quindi ho creato un nuovo controller 'MainWindowController' e ho spuntato 'con file xib'. Ho copiato NSwindow da MainMenu.xip e incollato nel nuovo file MainWindowController.xib cancellando quello vecchio. La 'Custom class' del proprietario del file è impostata su MainWindowController. Ho aggiunto il metodo init personalizzato a MainWindowController.m con 'self = [super initWithWindowNibName: @" MainWindowController "];'. Istanziare la proprietà MainWindowController nel metodo delegato dell'applicazione 'ApplicationDidFinishLaunching' con' mainWindow = [[MainWindowController alloc] init]; '.. nessun errore ma nessuna finestra. Qualcosa che ho perso? – TijuanaKez