2010-01-14 17 views
13

Tengo una UITableView con varias fuentes de datos. Esto se debe a que, tengo que cambiar los datos con un UISegmentedControl, y si los agrego como subvistas, no puedo usar la barra de estado para desplazarse hacia arriba, etc.UITableView no se actualiza correctamente después de cambiar dataSource

En un primer momento, se muestra una pantalla de inicio de sesión:

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

Entonces, una vez que el usuario ha iniciado la sesión, hago lo siguiente para cambiar al índice: 1 de la segmentedControler, que es su perfil:

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

sin embargo, la vista de tabla actualizaciones, pero es un poco de una mezcla entre los dos dataSources. Parte del texto ha cambiado, algunos se superponen, mientras que algunos faltan por completo.

¿Hay alguna otra manera en que deba cambiar el dataSource para una UITableView?

Thx

Respuesta

4

No estoy seguro de por qué esto está sucediendo en el código que ha publicado.

En lugar de cambiar el delegado y la fuente de datos, intercambiar los Ivar representa que se muestran los datos:

- (NSArray*)tableData{ 

    if(showingLogin) 
     return self.loginData; 

    return self.profileData; 
} 

Ahora sólo tienen 1 instancia UITableViewController, sino un BOOL decirle qué fuente de datos para su uso.

0

Guau, eso es extraño.

La última vez que hice algo así, simplemente utilicé varias vistas, oculté una y mostré otra cuando se pulsó el control segmentado. Hay otras soluciones posibles, pero probablemente sea la más fácil y quizás la más eficiente.

+0

Sí, estaba haciendo esto, pero luego no se puede desplazar hacia arriba a través de la barra de estado y tuve problemas para impulsar las vistas. – runmad

2

La vista de tabla almacena en caché las celdas internas que utiliza para mostrar sus datos. Entonces, si cambia la fuente de datos también debe verificar que su método - (UITableViewCell *) tableView: (UITableView *) tableView cellForRowAtIndexPath: (NSIndexPath *) indexPath está actualizando todas las celdas a los valores nuevos correctos.

De su descripción, parece que está utilizando las instancias de UITableViewCell en caché y no está actualizando a los datos nuevos correctos en todos los casos. Tal código como este:

- (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 solución más sencilla que encontré para este tipo de problema es hacer sólo la cadena que se utiliza para la creación de células (CellIdentifier) ​​en función de los datos de origen. En este caso, no mezcla la celda de los diferentes tipos de contenido (y esto también lo ayuda si las celdas deben tener un aspecto diferente según el modo).

9

Tuve exactamente el mismo problema. Mi solución consistía en ocultar el TableView, cambiar su fuente, volver a cargar los datos y hacer visible tableView nuevamente.

Ejemplo en C# (MonoTouch):

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

¡Muchas gracias por su publicación, he estado luchando por cambiar las fuentes de datos durante meses! – TChadwick

0

Tengo el mismo problema y lo que tiene que hacer es utilizar un identificador de celda diferente dentro - (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

he tenido este problema, resultó que era porque mis CellIdentifiers eran los mismos ...

static NSString *CellIdentifier = @"Cell"; 

cambiar uno de ellos y las celdas de disposición adecuada

static NSString *CellIdentifier2 = @"Cell2"; 
Cuestiones relacionadas