web-dev-qa-db-fra.com

Problèmes UITableView avec cellForRowAtIndexPath

J'essaie de remplir une vue modifiable avec plusieurs sections. Voici mon code:

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;

J'obtiens cette erreur lorsque j'essaie 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 à cet index se connecte en tant que chaîne légitime, mais il ne renvoie pas correctement la cellule. Ainsi, il ne se charge pas au-delà de ce point. Veuillez aider.

18
Haydn Dufrene

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

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

Que renvoyez-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 de l'un de mes projets, il pourrait vous donner un bon point de départ pour voir où vous vous trompez:

- (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;
}
28
Brock Woolf

Vous ne renvoyez probablement pas de cellule pour indexPath.row == 0 (votre 'cas 1' est suspect ...). Mais je ne peux pas dire à moins que vous ne publiez l'intégralité de votre déclaration de changement.

Essayez de renvoyer "cellule" en dehors de votre instruction switch, vous comprendrez mieux ce qui se passe. Vous n'aurez alors pas d'échec d'assertion.

2
Zoran Simic

Vérifiez que vous avez

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

dans

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

Ok, si toutes les autres solutions pour cette question ne fonctionnent pas, assurez-vous que l'identifiant de cellule pour la cellule de la vue tableau (dans le storyboard) 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 storyboard doit être "CustomCell" pour correspondre à ce code.

2
Scott Marchant

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

2
Ben Gottlieb