2009-12-29 14 views
18

Sto cercando di riempire una vista utente con più sezioni. Questo è il mio codice:UITableView Problemi 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; 

ottengo questo errore quando provo a caricare la visualizzazione:

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:' 

L'array a che i registri indice come una stringa legittima, ma non restituisce il cellulare correttamente . Quindi non carica oltre questo punto. Per favore aiuto.

risposta

2

Non sai perché hai "caso 1:" seduto là fuori tutto da solo, ma se si tratta di un caso diverso da 1, questo cadrà e tutto ciò che viene dopo questo sarà restituito. Assicurati di restituire SEMPRE una cella.

+0

ho capito. Ho impostato un'intera istruzione switch. Ho solo usato il primo per dare un esempio di ciò che stava accadendo. Non esegue un altro caso prima che dia l'errore. –

2

Probabilmente non stai restituendo una cella per indexPath.row == 0 (il tuo 'caso 1' è sospetto ...). Ma non posso dire se non pubblichi la tua intera dichiarazione di switch.

Prova a restituire 'cella' al di fuori dell'istruzione switch, capirai meglio cosa succede. Allora non avrai un errore di asserzione.

28

Sembra a me che avete un caso interruttore parzialmente visibile dove sta tornando una cella per caso 1. tuo errore mi fa pensare si restituisce un null UITableViewCell qualche ramo nel tuo caso l'interruttore.

Verificare che tutti i percorsi fuori da tale caso di commutazione restituiscano un oggetto valido UITableViewCell.

Cosa stai restituendo per il caso 0? In altre parole, cosa stai restituendo per la prima riga richiesta da UITableView?

Ecco un esempio di codice da uno dei miei progetti, si potrebbe dare un buon punto di partenza per vedere dove si sta andando male:

- (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 Come dici tu, quasi sicuramente al codice manca il default: caso o altrimenti restituisce nil su qualche percorso di codice. –

+0

ti prego, aiutami a capire il motivo per cui diamo se (cella == nil) se (cella == nil) { cella = [[[UITableViewCell alloc] initWithStyle: UITableViewCellStyleDefault reuseIdentifier: CellIdentifier] autorelease]; } Perché se cella == nil o se (! Cella), non entrerà mai nella condizione per creare una cella. –

+0

Se ho 1000 valori provenienti dal database allora in questo caso devo scrivere 1000 casi ?? –

2

check ti ha

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

in

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

Ok, se tutte le altre soluzioni a questa domanda non funzionano, fare in modo che l'identificatore di cella per la cella della vista tabella (nella storyboard) corrisponde l'identificatore di cella si utilizza nel codice tableviewdelegate:

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

L'identificativo cellula del vostro storyboard deve essere "CustomCell" per corrispondere a questo codice.

-3

Nel mio caso ho avuto lo stesso errore, perché mi mancava l'alloc/init:

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

} 
+0

Se si guarda il codice nella domanda, sta eseguendo un alloc ma utilizzando un inizializzatore più specifico. – Abizern

+0

Questo non funzionerà come vuoi, @Abizern è corretto. –

Problemi correlati