web-dev-qa-db-fra.com

Échec d'obtention d'une cellule à partir de sa source de données

Quel est le problème avec le code ci-dessous

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

    NSString *CellIdentifier  = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 

    cell.textLabel.text = @"hello";

    return cell;
}

Et 

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
    return 2;
}

mais j'obtiens n'a pas réussi à obtenir une cellule de son source de données

L'exception entière est 

*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'UITableView (<UITableView: 0x7ffe0b092800; frame = (0 97; 414 590); clipsToBounds = YES; autoresize = RM+BM; gestureRecognizers = <NSArray: 0x7ffe0acf3b10>; layer = <CALayer: 0x7ffe0aceb6e0>; contentOffset: {0, 0}; contentSize: {414, 88}>) failed to obtain a cell from its dataSource (<AllContactsViewController: 0x7ffe0ace60f0>)'

J'ai défini le délégué et la source de données pour la vue tableau

58
Rishab

Votre erreur suggère que cellForRowAtIndexPath renvoie nil pour une raison quelconque, et je suppose que c'est parce que vous ne parvenez pas à retirer de la file d'attente une cellule réutilisable. Si vous souhaitez confirmer cette information, définissez un point d'arrêt après votre appel de retrait de la file d'attente actuel: je suppose que vous constaterez que cell est défini sur nil.

Si vous utilisez des modèles Xcode modernes dans lesquels vous obtenez un prototype de cellule, vous devriez probablement utiliser ceci à la place:

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];

Si vous n'utilisez pas de modèle Xcode, utilisez quand même cette ligne de code, puis enregistrez votre propre identifiant de réutilisation, comme suit:

[self.tableView registerClass:[UITableViewCell self] forCellReuseIdentifier:@"Cell"];

Tout ce qui va bien devrait résoudre le problème. Je l'ai écrit plus en détail pour les utilisateurs de Swift.

72
TwoStraws

En utilisant Swift 3, j'ai rencontré cette erreur lorsque j'ai oublié d'ajouter les protocoles UITableViewDataSource et UITableViewDelegate à la déclaration ViewController.

classe DataViewController: UIViewController, UITableViewDataSource , UITableViewDelegate

Leur ajout corrige le problème.

147
David Reidy

Swift 3.0

Vous devez juste ajouter UITableViewDelegate et UITableViewDataSource

import UIKit

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource

L'image ci-dessous est juste pour votre référence.

 enter image description here

43
Vivek

Vous devez donner un identifiant à la cellule. "Cellule" donne l'identifiant de la cellule comme dans l'inspecteur d'attributs de la cellule dans le champ identifiant . J'ai reproduit votre erreur et c'est parce que vous n'avez pas donné d'identifiant à votre cellule.

3

Dans mon cas, j'avais oublié de déclarer UITableViewDataSource, UITableViewDelegate pour UITableview.

2
prakash singh

J'ai eu le même problème et c'est parce que j'ai oublié d'implémenter les protocoles UITableViewDataSource et UITableViewDelegate

ajoutez-les simplement à votre déclaration de classe après la classe héritée

xcode doit m'en avertir, car j'ai utilisé les méthodes UITableViewDataSource et UITableViewDelegate dans mon code

2

Vérifiez si vous avez ajouté UITableViewDataSource. J'ai raté ça, alors que l'application se plantait

1
Urvish Modi

Assurez-vous de ne pas avoir oublié d'implémenter les protocoles UITableViewDelegate et UITableViewDataSource.

class ExampleViewController: UIViewController, UITableViewDelegate, UITableViewDataSource

1
Mohsin Qureshi

Aussi s'il vous plaît essayez le code ci-dessous

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
 {
    static NSString *CellIdentifier = @"Cell";
    // Reuse and create cell    
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }
    // Update cell data contents
    cell.textLabel.text = @"Your text here";
    cell.detailTextLabel.text=@"Your detailed text label";

    return cell;
}
1
user3182143

Vous devez remplacer la méthode 'cellForRowAt'. Prenez garde si vous ne l'avez pas fait

0
oskarko

Vous n'utilisez probablement pas le même identifiant que celui que vous avez indiqué dans le scénario principal pour la cellule prototype. Essayez de lire le nom pour les majuscules et minuscules afin de vous assurer que vous utilisez l'identificateur correct.

Bonne chance:)

0

Si vous ne chargez pas Nib, vous devez d'abord l'enregistrer dans viewDidLoad. 

 [self.tableView registerNib:[UINib nibWithNibName:@"RecruitmentDetailViewC" bundle:nil] forCellReuseIdentifier:@"RecruitmentDetailViewC"];
0
GSK

dans mon cas, j'ai oublié de passer du prototype dynamique à la cellule statique, vérifiez cette partie dans le constructeur de votre interface

0
sarah

Après avoir suivi les étapes suggérées dans les autres messages et vérifié si ma cellule était vide, mon problème n’était pas résolu et ma cellule était pas apparaissant aussi nulle lorsque je l’ai vérifiée. Cependant, l'ajout de cet extrait de code pratique a permis de résoudre le problème. Il a donc dû être nul à un moment où je ne l'attrapais pas. 

if (cell == nil)
{
    NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"ClassNameOfMyCustomCell" owner:self options:nil];
    cell = [nib objectAtIndex:0];
}
0
jungledev

Lorsque vous utilisez tableViewCell en dehors de UITableView, vous devez enregistrer vous-même La NIB. Lorsque la NIB n'est pas enregistrée, l'erreur "Impossible d'obtenir une cellule à partir de sa source de données" peut se produire. De la description de l'erreur, j'ai toujours du mal à comprendre ce qui ne va pas.

Cette erreur peut être facilement résolue en enregistrant:

 [self registerNib:[customerButtonTableViewCell class]
     forCellReuseIdentifier:customerButtonCellIdentifier forTableView:tableView];
0
Vincent

Attention lors de la migration
Si quelqu'un migre son code d'anciennes versions de Swift vers des versions plus récentes, cela peut se produire si vous ne modifiez pas involontairement la syntaxe de UITableViewDataSource function par la nouvelle syntaxe de Swift.
Malheureusement, le compilateur ne s'en plaindra pas.
J'y ai fait face lors de la migration de mon code de Swift 2 à Swift 4. Je n'ai pas modifié la syntaxe de la méthode cellForRow DataSource à partir de: 

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell   

à sa version Swift 4: 

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell  

et j'ai eu l'erreur: 

"Failed to obtain a cell from its DataSource"
0
Mehdi