2010-07-17 12 views
6

Così comincio a imparare a usare Cocoa. Penso di averlo capito, ma sono costretto a creare e cambiare visualizzazioni. Sto riscrivendo un gioco che ho fatto un po 'di tempo fa per fare pratica. Tutto quello che voglio è una finestra (preferibilmente non ridimensionabile) e voglio essere in grado di cambiare le visualizzazioni per diversi schermi nel gioco.Come si cambiano le viste in un'applicazione Cocoa?

Per prima cosa, ho il menu principale (Inizia partita, Punteggi più alti, Esci). Quindi ho bisogno di una finestra per ogni schermata (schermata di gioco, schermata punteggi).

Ciò di cui mi sto confondendo è come progettarlo. Ho cercato NSViewController pensando di gestire le visualizzazioni ma non è così. Gestisce solo una vista caricandola davvero. Non capisco perché dovrei usare NSViewController quindi. Non potrei avere solo una classe di finestre che contiene sottoclassi multiple di NSView e caricarle in quel modo? Non sono sicuro di capire lo scopo del ViewController.

La mia classe Window ha davvero bisogno di sottoclasse NSWindowController? Stavo cercando di seguire l'esempio di esempio ViewController di Apple e ha una classe controller di finestra che è una sottoclasse di NSWindowController. Non vedo quale fosse lo scopo della sottoclassi di quello. Sembra che tutto il NSWindowController aggiunga sia - initWithPath:(NSString *)newPath ma non riesco a vederne l'utilizzo quando posso semplicemente modificare il file plist per aprire la finestra all'avvio. L'esempio di Apple ha anche una variabile NSView e una variabile NSViewController. Non ti serve solo una variabile per memorizzare la vista corrente?

Grazie in anticipo ragazzi, sono davvero confuso su come funziona.

risposta

1

Utilizzare i seguenti funzioni definite in UIVew (che fa parte della vostra finestra esistente)

- (void)addSubview:(UIView *)view 
- (void)removeFromSuperview 
+0

Sto preparando Cocoa sul desktop in questo momento. –

+2

stessa interfaccia disponibile in Desktop (NSView) –

+0

Quindi quello che mi piacerebbe sapere è perché dovrei usare NSViewController. Dovrei? Devo creare una sottoclasse di NSWindowController con una variabile NSView e NSViewController? Non sono sicuro di cosa sia veramente necessario per creare una finestra con viste commutabili. Da quanto ho capito, non ho affatto bisogno di NSViewController, ma non so perché l'esempio di Apple l'ha usato e dovrebbe rendere le cose più facili per te. –

5

Si utilizza NSWindowController e NSViewController per gestire una finestra o una vista, perché si deve solo bisogno di creare sottoclassi di NSWindow o NSView per nuovi "tipi" di finestre o viste. Ad esempio, se si desidera utilizzare una finestra circolare, si dovrebbe sottoclasse NSWindow. Se si desidera solo avere controlli in una finestra, si sottoclasse lo NSWindowController.

E 'lo stesso con NSViewController: Generalmente una vista NSViewController's sarà di una classe base come NSView (o forse proprio NSView sottoclasse che disegna uno sfondo personalizzato). Il NSViewController gestisce l'interazione tra le sottoview di quella vista, consentendogli di agire come una singola unità all'interno della tua applicazione più grande.

Pensateci in questo modo: Viste disegnate e trasformano eventi di input non elaborati in azioni di livello superiore. I controllori forniscono informazioni alle viste e gestiscono le azioni.

La composizione delle cose in questo modo può migliorare notevolmente la modularità del codice, semplificando la progettazione, la scrittura e il debug.

+0

Immagino che abbia un po 'più senso. Pensi che dovrei usare 'initWithNibName: bundle:' per caricare la vista o posso semplicemente impostare il "File's Owner" della vista sul ViewController? –

+0

Devi fare entrambe le cose. Si utilizza '-initWithNibName: bundle:' per istanziare la sottoclasse NSViewController. Carica il file del pennino specificato e agisce come proprietario del file; impostare la classe del proprietario del file del pennino nella sottoclasse NSViewController e puntare l'uscita "visualizzazione" del proprietario del file alla vista. –

4

Sembra che tu stia cercando di scambiare la visualizzazione del contenuto all'interno di una finestra? In questo caso, è possibile utilizzare -[NSView replaceSubview:with:] con -[NSWindow contentView] come destinatario.

Supponiamo di avere una pagina di titolo denominata titleView e una pagina di menu denominata menuView e si desidera scambiarli all'interno e all'esterno della finestra principale dell'applicazione.Se la pagina del titolo è visibile e l'utente fa clic su un pulsante "menu principale" o un link, si dovrebbe mettere qualcosa di simile nel metodo delegato del pulsante:

[[[NSApp mainWindow] contentView] replaceSubview:titleView with:menuView]; 

due cose per essere a conoscenza di:

  1. La vista precedente, titleView in questo caso, viene rilasciata da questa chiamata. Se vuoi che sia ancora disponibile, dovrai farlo retain prima di sostituirlo.
  2. La vista principale non verrà ridimensionata se le pagine hanno dimensioni diverse. Cambiando le dimensioni della cornice della finestra, e quindi il contentView è abbastanza facile, ma è possibile aggiungere un po 'di Animazione di base nel mix per dargli un po' di stile.

Spero che questo aiuti!

+0

OK, grazie! Approfondirò anche quello. Voi ragazzi siete tutti davvero d'aiuto. –

0

Sono nuovo al cacao ma penso che la tua app non richieda realmente un NSViewController. Un NSViewController svolge il ruolo di "Controller" nel modello di progettazione MVC. Quindi 'controlla' tutte le azioni - la logica della colla - all'interno di una singola vista.

Ad esempio, in una vista con più controlli: pulsanti, tabelle, caselle di controllo :, campi di selezione data, ecc. Esistono probabilmente interazioni dettagliate tra quei controlli che richiedono associazioni e aggiornamenti. Ad esempio, un clic sul pulsante carica un recupero del database, con gestione degli errori e convalida. La logica della colla entra nella classe NSViewController.

Nella tua app, sembra che ogni vista sia una semplice pagina con un minimo bisogno di controllo del livello di visualizzazione. Quindi, probabilmente hai bisogno di un singolo NSWindowController, un controller per gestire la logica e gli eventi per la transizione da una pagina all'altra.

Una tecnica per la gestione di più viste che riempiono una singola finestra consiste nell'utilizzare un NSTabView e impostare lo stile di tabulazione su "senza bordi" in IB. Quindi utilizzare l'azione del pulsante per selezionare NSTabViewItem richiesto. Durante lo sviluppo, imposta lo stile tabview su "top tab" e IB ti consente di passare attraverso le sottoview che desideri visualizzare.

Problemi correlati