it-swarm.com.de

Assertionsfehler in UITableView configureCellForDisplay: forIndexPath:

Ich bin mir nicht sicher, wo der Fehler liegt, nachdem ich ähnliche Probleme gesehen habe. Ich habe einen Assertionsfehler erhalten.

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

Ich denke, es ist etwas einfaches, aber ich hoffe, dass jemand helfen kann.

Unten ist mein 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

sie erstellen nie eine Zelle, Sie versuchen nur, eine Zelle aus der Warteschlange wiederzuverwenden. aber da du noch nie einen erschaffen hast, gibt es keinen.

- (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;
}

oder versuchen (nur 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;
}

von 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: muss immer überprüft werden, ob eine Zelle zurückgegeben wurde
-dequeueReusableCellWithIdentifier:forIndexPath: kann einen neuen instanziieren.

106
vikingosegundo

Wenn Sie im Storyboard keine Prototypzelle mit dem Bezeichner @"cell" definiert haben, wird beim Versuch, sie zu entschlüsseln, ein Bestätigungsfehler ausgegeben.

Sie können dies beheben, indem Sie die Identifier -Eigenschaft für die Prototypzelle festlegen (wählen Sie die Zelle aus und setzen Sie dieses Attribut im rechten Fensterbereich).

13
sapi

Ein sehr dummer Fehler, den ich gemacht hatte, war

ich habe UITableViewDelegate nicht gesetzt, UITableViewDataSource nach dem Namen der Controller-Klasse likemy (Klassencode) class TagsViewController: UIViewController

es sollte class TagsViewController haben: UIViewController, UITableViewDelegate, UITableViewDataSource

Möglicherweise steht einer von Ihnen vor diesem Hintergrund. Der gesamte andere Code war in Ordnung.

7
Ourang-Zeb Khan

Sie müssen "initWithStyle" in der benutzerdefinierten TableViewCell aufrufen und die Objekte erneut initialisieren.

Beispiel: Datei 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;
}

In der Hauptimplementierungsdatei 

- (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

Ich hatte den gleichen Fehler und konnte den Fehler finden. Ich hatte ein Array für die Segmente und Ansichtstitel:

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

Ich habe dieses Array dann als Datenquelle für meine Tabelle verwendet. Der Fehler, den ich erhielt, war auf die Tatsache zurückzuführen, dass ich tatsächlich die HelpViewSegue nicht in meinem Storyboard deklariert hatte, als ich den VC instanziierte:

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

Ziemlich trivial, aber es war ziemlich frustrierend! Hoffe das hat geholfen.

0
Septronic