2012-05-18 8 views
28

Ho un UIView che dovrà visualizzare due UITableViews, ma non vengono mai visualizzati insieme, utilizzando uno SegementedBar è possibile alternare uno o l'altro.2 UITableViews in un UIView

Quale sarebbe il modo migliore per gestire questo? Basta creare uno Table View Controller e modificare l'origine dati, oppure creare 2 Table View Controllers e nasconderne uno quando l'altro è visibile.

Le 2 tabelle avranno un layout completamente diverso con celle personalizzate differenti.

risposta

48

Manterrei una fonte dati & delegata.

Ciò significa che tutti i metodi delegato/origine dati diventano più complicati, MA significa che è possibile mantenere la relazione uno a uno tra viewController & view.

mantenere un riferimento a ciascuna delle viste tavola

//vc.h 
@property (nonatomic, weak) IBOutlet UITableView* firstTableView; 
@property (nonatomic, weak) IBOutlet UITableView* secondTableView; 

nell'origine dati/metodi delegato è necessario tenere conto del fatto che il metodo deve comportarsi in modo diverso a seconda che guarda la tabella è in uso. per esempio.

//vc.m 
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 

    ... 

    if (tableView == self.firstTableView) { 

     ... 

    } else { // tableView == self.secondTableView 

     ... 
    } 
} 

return cell; 

}

+0

Grazie, tuttavia, ho le stesse preoccupazioni del post di rishi, potrebbe causare una complessa struttura del codice, ma può anche risparmiare un sacco di doppio codice. –

+0

Il bonus è che non hai due controller, che controllano una vista che 'può' essere un vero dolore quando va male ... – Damo

+1

+1: questa implementazione è molto più facile da adattare e segue i pattern di progettazione di Apple per l'utilizzo di UISearchDisplayController. – CaptainRedmuff

4

Entrambi gli approcci hanno alcuni pro e contro, ma personalmente preferirò un approccio con due controller separati.

Approccio 1 - creare un Table View Controller e modificare l'origine dati

  • Questo aiuto approccio ad evitare codice aggiuntivo e ripetuto.
  • Con questa gestione della memoria è buono come utilizzare un solo controller. (Anche se questo non è un grosso problema fino ad allora non avremo molti dati.)
  • Problema con questo sta avendo complessità.

Approccio 2-2 Table View Controller

  • Con questo approccio sicuramente hanno codice aggiuntivo e ripetuto.
  • Ma con questo è meno complessità.
+1

Ho avuto le stesse preoccupazioni, mentre il primo approccio mi avrebbe risparmiato un sacco di codice, sono preoccupato che potrebbe causare una struttura di codice complessa. –

+1

@woutr_be: è per questo che ho detto che preferirò il secondo, perché voglio evitare una maggiore complessità. – rishi

+0

Grazie, per ora andrò per il primo approccio, se diventa troppo complesso posso ancora passare. –

0

Usa separata UITableViewControllers e scambiare le viste. È meno codice, meno complessità ed è il modo in cui Apple lo fa con il TabBar .

Per quanto riguarda la complessità del codice, non ce n'è davvero nessuna. È sufficiente effettuare le seguenti operazioni per passare da una visualizzazione quando il valore s' il UISegmentedControl è cambiata:

UIView *previousSuperview = myViewController1.view.superview; 
myViewController2.view.frame = myViewController1.view.frame; 
[myViewController1.view removeFromSuperview]; 
[previousSuperview addSubview:myViewController2.view]; 

alternativa, è possibile impostare la proprietà hidden corrispondente della vista.

+0

So che questo è un po 'ritardato ma mi piace la soluzione a questa risposta - la mia unica domanda è che i singoli UITableViewControllers agiscano ancora come l'origine dati per le proprie visualizzazioni di tabella –

+0

@MikeSimz Sì, per impostazione predefinita fanno proprio questo. Tuttavia, è possibile utilizzare un'origine dati comune se si desidera impostandola su entrambi gli UITableView. –

6
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 

    ... 

    if (tableView.tag == 1) { 

     ... 

    } else { // tableView == self.secondTableView 

     ... 
    } 
} 

tag può essere assegnato dal .xib. quindi non c'è bisogno di avere UITableVeiw variabile nel file .h. Due vista tabella in .xib necessaria

4

Nel mio attuale app, ho bisogno di avere 4 UITableView in un unico UIViewController, in una sola volta ho da mostrare tavolo singolo, in base alla scheda selezionata dall'utente, ho ha aggiunto quattro tabelle perché, avendo tutte diverse celle e funzionalità personalizzate, per ridurre la complessità ne ho prese quattro.

Il vantaggio principale di questo è che, ogni volta che non è necessario chiamare reloadData per aggiornare una singola tabella. Devo solo gestire correttamente lo show della tabella & nascondere il flusso. E credimi, è bello. Non sfogliando affatto.

Nel mio caso, sto creando quattro tabelle solo per codice. E faccio un metodo che mi restituirà un tavolo basato su un tag che ho passato.

Mantengo il cellForRowAtIndexPath il più piccolo possibile dividendo il codice in diverse funzioni.

+0

questo sembra interessante .. Quali metodi usi/modifichi per ottenere questo effetto? Gli esempi di codice sarebbero grandiosi. –

+0

@DavidDelMonte, non sarei in grado di condividere alcun esempio con te. Ma puoi creare un metodo che nasconderà tutte le tabelle e mostrerà solo una tabella particolare per la quale stai cercando. In 'cellForRowAtIndexPath' puoi differenziare ogni tabella dal suo tag. – Hemang

+0

Ho capito che funziona Hemang. Grazie mille. –

Problemi correlati