web-dev-qa-db-fra.com

UITableView dataSource doit renvoyer 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 vérifié tous les deux fois .. mais ne vois pas l'erreur.

Merci de votre aide!

43
phx

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

Votre code est correct, assurez-vous que votre fichier Interface Builder est correctement configuré. Dans FriendTableViewCell.xib, assurez-vous que le propriétaire du fichier est votre contrôleur d'affichage sous forme de table et que vous définissez correctement la cellule comme étant une sortie vers friendCell (qui, je suppose, est une UITableViewCell).

66
greenisus

Pour moi, ça a marché comme ça:

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

METTRE À JOUR
Placez le code ci-dessus dans la méthode suivante:

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

Il suffit de le mettreAVANTéditer la tableViewCell

33
JomanJi

Vous créez une FriendTableViewCell, vous l'ignorez et définissez-la égale (probablement) à une variable d'instance nommée friendCell.

Je suppose que vous attendez que friendCell soit défini lors de l'appel de la méthode loadNibNamed. Ce n'est apparemment pas en train d'être réglé.

Donc, vous avez deux problèmes avec ce code. Tout d'abord, 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 à une cellule sont inutiles si vous la remplacez par le deuxième appel à l'affectation à une cellule.

Deuxièmement, friendCell est probablement nul. Assurez-vous que la carte NIB est configurée correctement et que les sorties s’orientent aux bons endroits.

2
Ed Marty

Je sais que c'est un ancien message maintenant, mais, je viens de rencontrer cette erreur, je l'ai trouvée très étrange car l'application était en cours de test, il n'y avait donc pas de nouvelle génération depuis quelques jours. résolu.

2
Popeye

J'ai constaté que ce problème venait en essayant de créer mon UITableViewCell avant d'initialiser ma vue sous forme de tableau:

Ici, l’inscription de la classe avant la création de la tableView causera l’erreur, le placer après l’être corrigé.

[tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:bCellIdentifier]; 

tableView = [[UITableView alloc] initWithFrame:CGRectZero];
tableView.delegate = self;
tableView.dataSource = self;

[self addSubview:tableView];

tableView.keepInsets.equal = KeepRequired(0);
1
simon_smiley

N'oubliez pas de définir cell identifier dans Interface Builder.

0
zakhej

Assurez-vous que votre identifiant de réutilisation dans votre fichier NIB/Storyboard pour votre cellule prototype correspond à celui que vous avez appelé CellIdentifier 

 static NSString *CellIdentifier = @"Cell";
0
M Jesse

Regardez ici: Chargement de TableViewCell depuis NIB

C'est le document d'Apple pour 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 un nib. Définissez l'occurrence 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 de votre cellule.

0
Justin

Utilisez ceci ,

UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:kCellID];

J'ai économisé quelques heures de plus avec seulement ces lignes.

0
Sandy