2013-06-25 1 views
10

A volte desidero creare sottoclasse di UIViewController per alcune personalizzazioni dell'app. Per esempio. qualcosa che tutti i controller di visualizzazione dovrebbero eseguire durante viewDidLoad o viewWillAppear o così.Qual è la differenza tra UIViewController e UITableViewController

Ovviamente sottoclassi UIViewController e vado da lì e tutti i controller di visualizzazione ereditano da quello. Ma alcuni dei controller eseguono tabelle. E c'è UITableViewController progettato per questo scopo.

Quindi, sottoclassi anche UITableViewController e faccio solo le stesse cose lì. Quale non sembra essere la cosa più intelligente nei termini di OOP. E non c'è ereditarietà multipla ecc

E come UITableViewController eredita da UIViewController ...

Ora mi chiedo il motivo per cui non mi riferisco solo a creare il mio controller della vista tabella che eredita dalla mia molto personale controller della vista sottoclasse e aggiunge tutte le cose da tavola. Ma cosa è "tutta la roba del tavolo"?

  • C'è il codice dello scheletro che xcode aggiunge a ogni nuovo controller di visualizzazione tabella. Abbastanza utile ma che può essere facilmente spostato in frammenti di codice.
  • C'è la dichiarazione dei protocolli UITableViewDelegate e UITableViewDataSource. Affabile. L'implementazione di tali metodi deve comunque seguire in ciascuna sottoclasse di UITableViewController.
  • Ci sono probabilmente delle implementazioni predefinite ragionevoli di tutti quei metodi obbligatori nel protocollo. Come ad esempio il ritorno 0 per numberOfSectionsInTableView: o nullo per titleForHeaderInSection o 44.0f per heightForRowAtIndexPath: (. Cattivo esempio anche se potrebbe essere più intelligente, non attuando affatto)

Così, nonostante la roba ovvio, ci sono miracoli che prende UITableViewController cura di?

+0

Grazie a tutti quelli che hanno risposto. Questo aiuta molto su questa determinata decisione di architettura. –

risposta

10

Credo che tutti i comportamenti UITableViewController aggiunge è ben definito nella documentazione di classe: https://developer.apple.com/library/ios/#documentation/uikit/reference/UITableViewController_Class/Reference/Reference.html

classe L'UITableViewController crea un oggetto controller che gestisce una vista tabella. Implementa il seguente comportamento:

• Se un file pennino è imposta con l'initWithnibName: bundle: il metodo (che è dichiarata dal UIViewController superclasse), UITableViewController carica la visualizzazione della tabella archiviati nel file pennino. In caso contrario, crea un oggetto UITableView non configurato con le dimensioni corrette e la maschera di autoresize. È possibile accedere a questa vista tramite la proprietà tableView.

• Se viene caricato un file di pennino contenente la vista tabella, l'origine dati e il delegato diventano gli oggetti definiti nel file pennino (se presente). Se non viene specificato alcun file pennino o se il file pennino non definisce origine dati o delegato, UITableViewController imposta su se stessi l'origine dati e il delegato della vista tabella.

• Quando la vista tabella sta per apparire la prima volta che viene caricata, il controller vista tabella ricarica i dati della vista tabella. Inoltre cancella la sua selezione (con o senza animazione, a seconda della richiesta) ogni volta che viene visualizzata la vista tabella. La classe UITableViewController implementa ciò nel metodo superclass viewWillAppear :. È possibile disabilitare questo comportamento modificando il valore nella proprietà clearsSelectionOnViewWillAppear.

• Quando viene visualizzata la vista tabella, il controller lampeggia gli indicatori di scorrimento della vista tabella. La classe UITableViewController implementa ciò nel metodo superclass viewDidAppear :.

• Implementa il metodo superclasse setEditing: animato: in modo che se un utente tocca un pulsante Modifica | Done nella barra di navigazione, il controller alterna la modalità di modifica della tabella.

Tutti questi sono comportamenti che dovrebbero essere facili da ri-implementare se si applicano al controller e alla vista tabella specifici.

In generale ho trovato preferibile implementare questi comportamenti me stesso, al fine di consentire gerarchie di ereditarietà alternativi come avrete notato e perché io di solito considero l'impostazione sia la delagate e datasource di una vista tabella per essere un controller di vista un odore di progettazione . Quelli sono preoccupazioni indipendenti che di solito possono e dovrebbero essere gestiti da qualche altra classe (ad esempio un'origine dati dedicata per una particolare classe di modello) piuttosto che gonfiare un controller di visualizzazione.

+0

Grazie. Sembra fattibile e piace anche un buon investimento per i progetti futuere. Sei a conoscenza di un buon codice che potrebbe sottotitolare UITableView? –

+0

@Jonah Come implementate manualmente gli ultimi tre punti elenco in UIViewController (ad esempio, cancella la selezione ogni volta che viene visualizzata la tabella, lampeggia gli indicatori di scorrimento della vista tabella quando viene visualizzata la vista tabella e implementa il metodo superclasse setEditing: animato: o attiva/disattiva modalità di modifica della tabella)? Attualmente le mie celle rimangono evidenziate quando torno alla tableview, le barre di scorrimento non lampeggiano e premendo il pulsante Modifica non fa assolutamente nulla (non cambia nemmeno il testo del pulsante su Fatto). Potresti modificare la tua risposta con link o spiegazioni su come farlo? – golddove

+0

@golddove Sono riluttante a offrire soluzioni che ignorano la comprensione del problema, quindi non sono sicuro che gli esempi di codice possano essere utili qui.Se fossi incerto su come implementare gli indicatori di scorrimento lampeggianti, potrei iniziare osservando la documentazione di classe per 'UITableView', che non offre alcuna soluzione immediata, ma vedo che è una sottoclasse del più generale' UIScrollView'. 'UIScrollView' ha un metodo' flashScrollIndicators'. La chiamata di quel metodo all'interno di 'viewDidAppear 'di un controller riproduce il comportamento visto in un' UITableViewController'. – Jonah

0

Sembra che lo UITableViewController si prenda cura di molti problemi di gestione che in realtà si potrebbe fare solo per te stesso, se lo si desidera. Scopri the documentation - si creerà automaticamente un UITableView per voi, ricaricarla, ecc

+0

"UITableView si prende cura di molti problemi di gestione" - Suppongo che tu abbia inteso UITableViewController? Inoltre, l'autore ha sottolineato, che intende "accanto a cose ovvie" di cui stai scrivendo. – Vive

3

Così, nonostante la roba ovvia, ci sono miracoli che UITableViewController si prende cura di?

Non che io sappia. Per quanto ne so, lo UITableViewController è per lo più una classe di convenienza che può essere sostituita con una propria sottoclasse che aggiunge alcune righe di codice.

Apple's class documentation praticamente dice tutto ciò che fa UITableViewController (e non lo ripeto qui perché potrebbe cambiare in futuro). A volte, informazioni aggiuntive possono essere ricavate dal file di intestazione di una classe, ma nel caso di UITableViewController.h i commenti del codice sorgente ripetono semplicemente ciò che è già presente nei documenti di classe.

Alla fine è necessario decidere da soli cosa si desidera replicare nella propria sottoclasse. Forse il tuo progetto non ha bisogno di maneggiare il nib? O nessuna delle tue visualizzazioni tabella è modificabile? Quindi non scrivere il codice ...