web-dev-qa-db-fra.com

É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;

}
48
Jason Taylor

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 un nouveau.

106
vikingosegundo

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 du 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).

13
sapi

Une erreur très stupide que j'avais faite était

je n'ai pas placé UITableViewDelegate, UITableViewDataSource après le nom de la classe du contrôleur, comme suitmy code de classe était classe TagsViewController: UIViewController

il devrait avoir class TagsViewController: UIViewController, UITableViewDelegate, UITableViewDataSource

Peut-être que l'un de vous est confronté à cause de cela, tout le code était correct.

7
Ourang-Zeb Khan

Vous devez appeler "initWithStyle" dans TableViewCell personnalisé et initialiser à nouveau les objets.

Exemple: fichier ProductTableViewCell.m

@implementation ProductTableViewCell

- (void)awakeFromNib {
}

- (void)setSelected:(BOOL)selected animated:(BOOL)animated {
   [super setSelected:selected animated:animated];
}

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
    if (self = [super initWithStyle:style reuseIdentifier:reuseIdentifier])
    {
        self.selectionStyle = UITableViewCellSelectionStyleNone;
        _titleLabel = [[UILabel alloc] initWithFrame:(CGRectMake(70, 0, 320, 60))];
        [self.contentView addSubview:_titleLabel];
   }
   return self;
}

Dans le fichier principal d'implémentation 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ 
    ProductTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"productTableViewCell"];
    NSDictionary *dic = nil;
    if (tableView == self.searchDisplayController.searchResultsTableView) {
        dic = [_filteredArray objectAtIndex:indexPath.row];
    } else {
        dic = [_originalArray objectAtIndex:indexPath.row];
    }
    cell.titleLabel.text = [dic objectForKey: @"title"];
    return cell;
}
0
user1802778

J'ai eu la même erreur et j'ai réussi à trouver la faute. J'ai eu un tableau pour les titres et voir les titres:

NSArray *MMTitles= [NSArray arrayWithObjects:@"MainMenu",@"viewIt",@"viewNots",@"MyProfile",@"Settings",@"Instructions",@"Help", nil];
NSArray *MMSegues=[NSArray arrayWithObjects:@"MainMenu",@"MyProfileSegue",@"viewNotSegue",@"MyProfileSegue",@"SettingsTableViewSegue",@"InstructionsViewSegue",@"HelpViewSegue", nil];

self.menuItems = [[NSArray alloc]initWithObjects:MMTitles,MMSegues, nil];

J'ai ensuite utilisé ce tableau comme source de données pour ma table. L'erreur que je recevais était due au fait que je n'avais en fait pas déclaré la HelpViewSegue dans mon Storyboard lorsque j'ai instancié le VC:

    vc = [mainStoryboard instantiateViewControllerWithIdentifier: [[self.menuItems objectAtIndex:1]objectAtIndex:indexPath.row]];

Assez trivial, mais c'était assez frustrant! J'espère que cela a aidé.

0
Septronic