50 votes

Échec d'assertion dans UITableView configureCellForDisplay: forIndexPath:

Je ne sais pas trop où est l'erreur, après avoir examiné d'autres problèmes similaires. J'ai reçu un échec d'assertion.

 Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: UITableView dataSource must return a cell from tableView:cellForRowAtIndexPath:
 

Je pense que c'est quelque chose de simple mais j'espère que quelqu'un pourra vous aider.

Ci-dessous mon code:

 #import "StockMarketViewController.h"

@interface StockMarketViewController ()

@end


@implementation StockMarketViewController
@synthesize ShareNameText, ShareValueText, AmountText;
@synthesize shares, shareValues;


- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section;
{
    return [shares count];

}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;
{
    UITableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:@"cell"];



    NSString *currentValue = [shareValues objectAtIndex:[indexPath row]];
    [[cell textLabel]setText:currentValue];
    return cell;

}
 

108voto

vikingosegundo Points 30323

vous ne créez jamais de cellule, vous essayez simplement de réutiliser une cellule retirée de la file d'attente. mais comme vous n'en avez jamais créé, il n'y en a pas.

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;
{
    static NSString *cellIdentifier = @"cell";
    UITableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
    if (!cell) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:cellIdentifier];
    }

    NSString *currentValue = [shareValues objectAtIndex:[indexPath row]];
    [[cell textLabel]setText:currentValue];
    return cell;
}
 

ou essayez (seulement iOS 6+)

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;
{
    static NSString *cellIdentifier = @"cell";
    UITableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier forIndexPath:indexPath];

    NSString *currentValue = [shareValues objectAtIndex:[indexPath row]];
    [[cell textLabel]setText:currentValue];
    return cell;
}
 

de UITableView.h

 - (id)dequeueReusableCellWithIdentifier:(NSString *)identifier;  // Used by the delegate to acquire an already allocated cell, in lieu of allocating a new one.
- (id)dequeueReusableCellWithIdentifier:(NSString *)identifier 
                           forIndexPath:(NSIndexPath *)indexPath NS_AVAILABLE_IOS(6_0); // newer dequeue method guarantees a cell is returned and resized properly, assuming identifier is registered
 

-dequeueReusableCellWithIdentifier: aura toujours besoin d’un chèque, si une cellule a été retournée, pendant
-dequeueReusableCellWithIdentifier:forIndexPath: peut en instancier une nouvelle.

13voto

sapi Points 3800

Si vous n'avez pas défini de cellule prototype avec l'identificateur @"cell" dans Storyboard, vous obtiendrez une erreur d'assertion lorsque vous tenterez de la retirer de la file d'attente.

Vous pouvez résoudre ce problème en définissant la propriété Identifier sur la cellule prototype (sélectionnez la cellule et définissez cet attribut dans le panneau de droite).

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