2009-06-03 4 views
5

Ho un'applicazione Core Data non basata su documenti. C'è un NSTreeController che gestisce una raccolta di oggetti visualizzati in un singolo NSOutlineView come un elenco di fonti. Sono i soliti tipi di cose: intestazioni, cartelle, cartelle intelligenti, ecc.NS (Array | Tree) Controller Architecture per più NSViewControllers

Ciascuno di questi oggetti contenitore contiene una raccolta di oggetti contents. Ho tre distinti controller di visualizzazione che visualizzano questi oggetti in vari modi (uno NSTableView e due viste grafiche personalizzate, se proprio lo vuoi sapere) Ma queste sono solo tre diverse presentazioni degli stessi dati. Dovrebbero sempre mostrare gli stessi oggetti, condividere la stessa selezione, ecc.

Sto anche utilizzando una gerarchia di NSViewController s per gestire le mie visualizzazioni. (Se avessi saputo dell'eccellente KTUIKit di Cathy Shive in quel momento, l'avrei usato, ma i miei controller di visualizzazione sono molto simili - e molto ispirati a - suoi)

Così com'è ora, io avere un NSTreeController che vive nel controller di visualizzazione per la vista elenco di origine. Ho anche un NSArrayController in ciascuno dei controller della vista secondaria che è associato allo NSTreeController tramite alcuni keypath troppo complicati.

Allora, che cosa ha bisogno di cambiare, a mio parere, è la seguente:

  • Le NSTreeController ha bisogno di muoversi fuori del controllore della vista struttura.
  • Ci dovrebbe essere un singolo NSArrayController a cui ciascuna delle viste dei contenuti può essere associata anziché tre separate. Anche se sono meno sicuro di questo punto.

Quello che sto avendo difficoltà è capire dove queste cose dovrebbero vivere. Sto attraversando un periodo difficile nel decidere quali oggetti, se ve ne sono, "possedere" veramente i vari controller. Lo possiedono i controller della vista genitore? Il controller della finestra? Dato che si tratta di dati a livello di applicazione, posso arrivare al punto di farli appartenere al Delegato app? (Potrei immaginare una circostanza in cui un utilizzo potrebbe voler aprire più finestre, anche se non è attualmente supportato) Che cosa pensa la mente dell'hive di StackOverflow?

risposta

2

NSArrayController e NSTreeController sono considerati più oggetti di visualizzazione che controller veri, quindi sembra che tu sia sulla strada giusta. Avrei iniziato nello stesso modo in cui lo avete fatto, assegnando a ciascun NSViewController il proprio NSArrayController o NSTreeController secondo necessità, e configurando i collegamenti tra di loro in fase di esecuzione attraverso il controller della finestra che è responsabile della combinazione di tutti i pezzi.

Se pensate che semplifichi le cose, non sembra che ci sarebbe qualcosa di sbagliato nello spostamento degli oggetti NSArrayController e NSTreeController nel controller della finestra. È ancora possibile impostare i collegamenti a RepresentObject del controller della vista in IB, quindi creare i controller array/tree nel codice nel controller della finestra al momento opportuno. Basta stare attenti a non complicarsi troppo qui. Ho scoperto che quando si hanno molti controller di vista nella stessa finestra usando representObject per cose diverse, è più facile creare proprietà separate, tipizzate in modo da poter capire quali parti vanno dove.

Non capisco davvero il vantaggio di delegare i controller di array/tree controller dell'app, ma non so molto su cosa ci stai facendo. Forse trarrai beneficio dal creare il tuo oggetto "controllore dati"?

Domande come questa possono essere difficili da decidere dato che a volte non c'è una risposta "giusta", ma finché si tiene a mente semplicità e comprensibilità starete bene. Non aver paura di scegliere un piano e andare avanti, puoi sempre fare il refactoring più tardi ... So che ci sono state volte in cui ho passato giorni in domande di architettura come questa, quando avrei potuto lavorare su qualcosa di più pratico!

+0

Grazie per la vostra risposta riflessiva! Ho sempre considerato i controller degli oggetti più orientati alla vista. Questo è parte del motivo della mia indecisione qui :-) Non avevo pensato di usare representObject per i controller; Mi ero quasi rassegnato a fare i collegamenti a livello di programmazione. La motivazione per questa domanda è che ho raggiunto un punto in cui devo refactoring. Sta diventando troppo doloroso per gestire tutta la complessità di avere controller in posti strani. Ho anche escluso il delegato dell'app come il luogo appropriato. La finestra sembra il posto più logico per questo. – Alex