2009-12-29 6 views
18

J'essaie de remplir une vue uitable avec plusieurs sections. Voici mon code:UITableView Problèmes avec 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; 

Je reçois cette erreur lorsque je tente de charger la vue:

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

Le tableau à ce que les journaux d'index comme une chaîne légitime, mais il ne retourne pas la cellule correctement . Ainsi, il ne charge pas passé ce point. S'il vous plaît aider.

Répondre

2

Je ne sais pas pourquoi vous avez "cas 1:" assis là tout seul, mais si c'est un cas AUTRE que 1, cela va tomber à travers, et tout ce qui vient après cela sera retourné. Assurez-vous de toujours retourner une cellule.

+0

Je comprends. J'ai une déclaration de commutateur entier mis en place. Je n'ai utilisé que le premier pour donner un exemple de ce qui se passait. Il ne lance pas un autre cas avant de donner l'erreur. –

2

Vous ne renverrez probablement pas une cellule pour indexPath.row == 0 (votre 'cas 1' est suspect ...). Mais je ne peux pas le dire, sauf si vous publiez votre déclaration entière de commutateur. Essayez de renvoyer 'cell' en dehors de votre déclaration de commutateur, vous comprendrez mieux ce qui se passe. Vous n'aurez pas d'échec d'assertion alors.

28

Il me semble que vous avez un cas de commutateur partiellement visible où il renvoie une cellule pour le cas 1. Votre erreur me fait penser que vous renvoyez une branche UITableViewCell nulle dans votre cas de commutateur.

Assurez-vous que tous les chemins de ce cas de commutation renvoient un objet UITableViewCell valide.

Que retournez-vous pour le cas 0? En d'autres termes, que renvoyez-vous pour la première ligne demandée par UITableView?

Voici un exemple de code d'un de mes projets, il pourrait vous donner un bon point de départ pour voir où vous allez 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 Comme vous le dites, presque certainement le code par défaut est manquant: case ou retourne autrement nil sur un chemin de code. –

+0

s'il vous plaît aidez-moi à comprendre pourquoi donnons-nous si (cellule == nil) si (cellule = nil) { cellule = [[[UITableViewCell alloc] initWithStyle: UITableViewCellStyleDefault reuseIdentifier: CellIdentifier] autorelease]; Parce que si cell == nul ou if (! Cell), il ne passera jamais dans la condition pour créer une cellule } –

+0

Si je reçois 1000 valeur provenant de la base de données alors dans ce cas dois-je écrire 1000 cas ?? –

2

Vérifiez que vous a

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

dans

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

Ok, si toutes les autres solutions pour cette question ne fonctionnent pas, assurez-vous que l'identificateur de cellule pour la table de la cellule de vue (dans le story-board) correspond à l'identifiant de cellule que vous utilisez dans votre code tableviewdelegate:

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

L'identifiant de cellule dans votre story-board doit être « CustomCell » pour correspondre à ce code.

-3

Dans mon cas, je faisais la même erreur, car je manquais le alloc/init:

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

} 
+0

Si vous regardez le code dans la question, il fait un alloc mais en utilisant un initialiseur plus spécifique. – Abizern

+0

Cela ne fonctionnera pas comme vous le souhaitez, @Abizern est correct. –

Questions connexes