2010-01-14 20 views
13

Ho un UITableView con diverse origini dati. Questo perché, ho bisogno di cambiare i dati con un UISegmentedControl, e se li aggiungo come subviews, non riesco a utilizzare la barra di stato per scorrere verso l'alto, eccUITableView non si aggiorna correttamente dopo aver modificato dataSource

In un primo momento, mi mostrano una schermata di login:

self.tableView.dataSource = loginTableView; 
self.tableView.delegate = loginTableView; 
[self.tableView reloadData]; 

Poi, una volta che l'utente si è connesso, faccio la seguente per cambiare all'indice: 1 del segmentedControler, che è il loro profilo:

self.tableView.dataSource = profileTableView; 
self.tableView.delegate = profileTableView; 
[self.tableView reloadData]; 

Tuttavia, gli aggiornamenti vista tabella, ma è un po 'di un mix tra le due origini dati. Alcuni dei testi sono cambiati, alcuni si sovrappongono, mentre alcuni sono completamente mancanti.

C'è un altro modo in cui dovrei cambiare il dataSource per un UITableView?

Thx

risposta

4

Non so perché questo sta accadendo dal codice che hai postato.

Invece di cambiare il delegato e origine dati, scambiare qualunque ivar rappresenta visualizzati i dati:

- (NSArray*)tableData{ 

    if(showingLogin) 
     return self.loginData; 

    return self.profileData; 
} 

Ora si hanno solo 1 istanza UITableViewController, ma un BOOL per dirti che origine dati da utilizzare.

0

Wow, questo è strano.

L'ultima volta che ho fatto qualcosa di simile, ho semplicemente usato più viste, nascondendone una e mostrandone un'altra quando il controllo segmentato veniva toccato. Ci sono altre possibili soluzioni, ma questo è probabilmente il più semplice e forse il più efficiente.

+0

Sì, lo stava facendo questo, ma poi non è possibile scorrere verso l'alto tramite lo statusBar e stavo avendo problemi a spingere le viste. – runmad

2

La vista tabella memorizza nella cache le celle internamente utilizzate per la visualizzazione dei dati. Quindi, se cambi l'origine dei dati dovresti anche verificare che sia - (UITableViewCell *) tableView: (UITableView *) tableView cellForRowAtIndexPath: (NSIndexPath *) Il metodo indexPath sta aggiornando tutte le celle ai nuovi valori corretti.

Dalla tua descrizione sembra che stia utilizzando le istanze di UITableViewCell memorizzate nella cache e non lo aggiorni ai nuovi dati corretti in tutti i casi. Forse codice come questo:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *CellIdentifier = @"Cell"; 

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) 
    { 
     cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; 
     cell.frame = CGRectZero; 
     cell.textLabel.font = //Set font; 
     cell.selectionStyle = UITableViewCellSelectionStyleNone; 
     cell.textLabel.text = @"My Text for this cell"; // <==== Not good! Move it out of this if block 
    } 
    // Set cell text here 
} 

La soluzione più semplice che ho trovato per questo tipo di problema è quello di fare solo la stringa che si utilizza per la creazione di cellule (CellIdentifier) ​​a seconda della sorgente di dati. In questo caso non mescoli la cella dei diversi tipi di contenuto (e questo ti aiuta anche se le celle devono avere un aspetto diverso a seconda della modalità).

9

Ho avuto lo stesso identico problema. La mia soluzione era di rendere il TableView nascosto, cambiarlo come sorgente, ricaricare i dati e rendere nuovamente visibile il TableView.

Esempio in C# (MonoTouch):

tableView.Hidden = true; 
tableView.Source = newTableViewSource; 
tableView.ReloadData(); 
tableView.Hidden = false; 
+0

Grazie mille per il tuo post, avevo faticato a cambiare le fonti di dati per mesi! – TChadwick

0

Ho lo stesso problema e quello che hai da fare è utilizzare un identificatore di cella diversa entro - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath.

if (self.segmentedControl.selectedSegmentIndex == 0) { 
    self.cellIdentifier = @"segmentOne"; 
} else { 
    caseAtIndexPath = [self.awaitingReviewCaseList caseAtIndex:indexPath.row]; 
    self.cellIdentifier = @"segmentTwo"; 
} 
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:self.cellIdentifier forIndexPath:indexPath]; 
1

Ho avuto questo problema, si è scoperto che era perché i miei CellIdentifiers erano gli stessi ...

static NSString *CellIdentifier = @"Cell"; 

Cambio uno di loro e le celle di layout correttamente

static NSString *CellIdentifier2 = @"Cell2"; 
Problemi correlati