43 votes

UITableView dataSource doit retourner une cellule de tableView:cellForRowAtIndexPath : Exception

En fait, je ne vois pas mon erreur :

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

  FriendTableViewCell *cell = (FriendTableViewCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
  if (cell == nil) {
      cell = [[[FriendTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
      [[NSBundle mainBundle] loadNibNamed:@"FriendTableViewCell" owner:self options:nil];
      cell = friendCell;
  }
  cell.lblNickname.text =  @"Tester";
  return cell;
}

Qu'est-ce que je fais mal ? J'ai tout vérifié deux fois mais je ne vois pas l'erreur.

Merci pour votre aide !

66voto

greenisus Points 1333

Vous renvoyez friendCell, et c'est très probablement nul.

Votre code semble correct, assurez-vous que votre fichier de construction d'interface est bien configuré. Dans le fichier FriendTableViewCell.xib, assurez-vous que le propriétaire du fichier est le contrôleur de la vue de la table et que vous avez correctement défini la cellule pour qu'elle soit une sortie vers friendCell (qui, je suppose, est une UITableViewCell).

33voto

JomanJi Points 528

Pour moi, ça a marché en faisant ça :

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

UPDATE
Placez le code ci-dessus dans la méthode suivante :

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

Mets-le juste AVANT modification de la tableViewCell

2voto

Ed Marty Points 24861

Vous créez un FriendTableViewCell puis l'ignore et la rend égale à une variable d'instance nommée friendCell (probablement).

Je suppose que vous attendez que friendCell soit défini lors de l'appel de la méthode loadNibNamed. Apparemment, il ne l'est pas.

Donc vous avez deux problèmes avec ce code. Premièrement, n'allouez pas une cellule deux fois.

cell = [[[FriendTableViewCell ....
[[NSBundle mainBundle .....
cell = friendCell;

De toute évidence, la création d'une nouvelle cellule et son affectation à cell ne servent à rien si vous l'écrasez avec le deuxième appel à l'affectation à cell.

Deuxièmement, friendCell est probablement nul. Assurez-vous que le NIB est configuré correctement et que les sorties pointent aux bons endroits.

2voto

Popeye Points 5478

Je sais que c'est un vieux post maintenant mais, je viens de rencontrer cette erreur, je l'ai trouvé très étrange comme l'application était en test donc pas de nouvelles constructions pour quelques jours et il a fait cela, tout ce que j'ai fait était de redémarrer le téléphone et il l'a résolu.

0voto

Justin Amberson Points 6033

Regardez ici : Chargement de TableViewCell à partir de NIB

Voici le document d'Apple sur ce sujet précis.

//This is assuming you have tvCell in your .h file as a property and IBOutlet
//like so:
TableViewController.h
@property(nonatomic,retain) IBOutlet UITableViewCell *tvCell;
//Data Source Method...
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:MyIdentifier];

if (cell == nil) {

    [[NSBundle mainBundle] loadNibNamed:@"TVCell" owner:self options:nil];

    cell = tvCell;

    self.tvCell = nil;

Utilisez la méthode loadNibNamed:owner:options pour charger une cellule dans une nib. Définissez l'instance de cellule sur votre objet nib, puis définissez l'objet nib sur nil.

Lisez le reste de la documentation que j'ai liée pour savoir comment accéder aux sous-vues dans votre cellule.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X