2009-12-29 23 views
18

Estoy intentando completar una vista única con varias secciones. Este es mi código:Problemas de UITableView con cellForRowAtIndexPath

static NSString *CellIdentifier = @"Cell"; 
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
if (cell == nil) { 
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; 
} 

case 1: 
[[cell textLabel] setText:[usersTeachers objectAtIndex:(indexPath.row+1)]]; 
return cell; 
break; 

consigo este error cuando intento cargar la vista:

2009-12-28 21:09:48.380 FSS[2046:207] *** Assertion failure in -[UITableView _createPreparedCellForGlobalRow:withIndexPath:], /SourceCache/UIKit/UIKit-984.38/UITableView.m:4709 
2009-12-28 21:09:48.381 FSS[2046:207] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'UITableView dataSource must return a cell from tableView:cellForRowAtIndexPath:' 

El orden de batalla en que los registros de índice como una cadena legítima, pero no devuelve la celda correctamente . Por lo tanto, no se carga más allá de este punto. Por favor ayuda.

Respuesta

2

No estoy seguro de por qué tiene "caso 1:" sentado allí solo, pero si se trata de un caso distinto de 1, esto se va a caer, y lo que venga después de esto será devuelto. Asegúrese de SIEMPRE devolver una celda.

+0

entiendo. Tengo configurada una instrucción switch completa. Solo usé el primero para dar un ejemplo de lo que estaba sucediendo. No ejecuta otro caso antes de que proporcione el error. –

2

Probablemente no está devolviendo una celda para indexPath.row == 0 (su 'caso 1' es sospechoso ...). Pero no puedo decirlo a menos que publiques toda tu declaración de cambio.

Intente devolver 'celda' fuera de su instrucción de cambio, comprenderá mejor qué sucede. No tendrá una falla de aserción entonces.

28

Me parece que tiene una caja de conmutadores parcialmente visible donde devuelve una celda para la caja 1. Su error me hace pensar que está devolviendo una rama UITableViewCell nula en su caja de interruptores.

Asegúrese de que todas las rutas de salida de esa caja de conmutadores devuelvan un objeto válido UITableViewCell.

¿A qué regresas para el caso 0? En otras palabras, ¿a qué regresa en la primera fila que solicita UITableView?

Este es un ejemplo de código de uno de mis proyectos, Puede ser que le dará un buen punto de partida para saber a dónde va mal:

- (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]; 
    } 

    NSInteger section = [indexPath section]; 

    switch (section) { 
     case 0: // First cell in section 1 
      cell.textLabel.text = [collectionHelpTitles objectAtIndex:[indexPath row]]; 
      break; 
     case 1: // Second cell in section 1 
      cell.textLabel.text = [noteHelpTitles objectAtIndex:[indexPath row]]; 
      break; 
     case 2: // Third cell in section 1 
      cell.textLabel.text = [checklistHelpTitles objectAtIndex:[indexPath row]]; 
      break; 
     case 3: // Fourth cell in section 1 
      cell.textLabel.text = [photoHelpTitles objectAtIndex:[indexPath row]]; 
      break; 
     default: 
      // Do something else here if a cell other than 1,2,3 or 4 is requested 
      break; 
    } 
    return cell; 
} 
+2

+1 Como dices, casi con certeza el código no tiene el valor predeterminado: caso o de lo contrario devuelve nada en alguna ruta de código. –

+0

por favor me ayude a entender por qué le damos si (célula == nil) si (célula == nil) { células = [[[UITableViewCell alloc] initWithStyle: UITableViewCellStyleDefault reuseIdentifier: CellIdentifier] autorelease]; } Porque si cell == nil o if (! Cell), nunca entrará en la condición para crear una celda. –

+0

Si estoy obteniendo 1000 valores de la base de datos, ¿en este caso tengo que escribir 1000 casos? –

2

Comprobar que consiguió

if (cell == nil) { 
     cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; 
    } 

en

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
2

Ok, si todas las demás soluciones para esta pregunta no funcionan, asegúrese de que el identificador de celda para la celda de la vista de tabla (en el guión gráfico) coincide con el identificador de celda que utiliza en su código tableviewdelegate:

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

El identificador de celda en el guión gráfico debe ser "CustomCell" para que coincida con el código.

-3

En mi caso yo estaba teniendo el mismo error porque me faltaba el alloc/init:

if (cell == nil) { 
     cell = [[UITableViewCell alloc] init]; 

} 
+0

Si observa el código en la pregunta, está haciendo una asignación pero usando un inicializador más específico. – Abizern

+0

Esto no funcionará como lo desee, @Abizern es correcto. –

Cuestiones relacionadas