2013-03-09 10 views
46

Ich bin nicht sicher, wo der Fehler hier ist, nachdem andere ähnliche Probleme untersucht wurden. Ich habe einen Assertionsfehler erhalten.Assertionsfehler in UITableView configureCellForDisplay: forIndexPath:

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

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

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; 

} 
+0

Bitte aktualisieren Sie Ihre Frage, um zu markieren, welche Zeile die Ausnahme verursacht. Wenn Sie es nicht wissen, setzen Sie Breakpoints und gehen Sie durch den Code, bis Sie die genaue Zeile gefunden haben. –

+0

Nun, ich bin neu bei xcode, so bin ich unsicher mit diesen Dingen, aber in diesem Fall, gibt es keine Fehler angezeigt, und das Programm läuft aber abstürzt, wenn ich die entsprechende Seite auswählen? Also weiß ich nicht, welche Zeile der Fehler ist, wenn das Sinn macht? Ich würde annehmen - (UITableViewCell *) tableView: (UITableView *) tableView ZelleForRowAtIndexPath: (NSIndexPath *) indexPath; –

+0

Gibt es tatsächlich eine Zelle mit der (case-sensitive) Kennung @ "Zelle"? – sapi

Antwort

103

Sie sind nie eine Zelle erstellen, können Sie nur versuchen, ein Aus der Warteschleife angenommene Zelle wieder zu verwenden. Aber da du 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: benötigen immer eine Überprüfung, ob eine Zelle zurückgebracht wurde, während
-dequeueReusableCellWithIdentifier:forIndexPath: kann neue instanziieren.

+2

Was er macht, ist völlig in Ordnung. 'dequeueReusableCellWithIdentifier' erstellt die Zelle, wenn sie nicht existiert. – sapi

+9

@ sapi nicht so, es wird nur eine Zelle erstellen, wenn Sie Storyboard-Prototypen verwenden oder eine Feder oder Klasse zur Wiederverwendung registriert haben. – jrturton

+1

Stimmt, aber wenn er einem Tutorial folgt, ist es sehr wahrscheinlich, dass er Prototypen verwendet (oder es versucht, aber nicht definiert hat). Das erwartet auch der Standard-Code-Stub für 'UITableViewController'. – sapi

13

Wenn Sie im Storyboard keine Prototyp-Zelle mit der ID @"cell" definiert haben, erhalten Sie einen Assertionsfehler, wenn Sie versuchen, die Warteschlange zu entfernen.

Sie können dies beheben, indem Sie die Eigenschaft Identifier für die Prototypzelle festlegen (wählen Sie die Zelle aus, und legen Sie das Attribut im rechten Bedienfeld fest).

+0

Das mag schockierend klingen, aber ich verwende keine Storyboards? Kann ich noch etwas anderes machen? Und warum wählen die Leute meine Frage, Ratschläge zur Verbesserung? Für seine harte Start dieser Sprache aus einem nicht programmierten Hintergrund. Danke –

+0

Wenn Sie keine Storyboards verwenden, lesen Sie den @ jrturton-Kommentar zu vikingosegundos Antwort. – sapi

+1

Danke. Ich hatte versehentlich die "Restauration i.d." eingestellt. im Identity Inspector zu "Zelle" und nicht zum "Bezeichner" in der Attributprüfung. –

0

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

Beispiel: ProductTableViewCell.m Datei

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

Im 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

hatte ich den gleichen Fehler, und ich schaffte es, den Fehler zu finden. Ich hatte ein Array für die segues und Ansicht Titel:

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

habe ich dann dieses Array als Datenquelle für meinen Tisch. Die Fehler, die ich erhielt war aufgrund der Tatsache, dass ich nicht in der Tat hatte die HelpViewSegue in meinem Storyboard erklärt, wenn ich die VC instanziiert:

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

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

-1

Im folgenden Code, den Sie @"cell" geschrieben haben (mit einem kleinen c geschrieben), aber Sie haben verwenden @"Cell" (C muss Kapital sein).

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

Ein sehr dumme Fehler, den ich gemacht hatte, waren

ich nicht die UITableViewDelegate, UITableViewDataSource nach den Controller-Klasse Namen gebracht habe wie meinen Klassencode war Klasse TagsViewController: UIViewController

Es sollte Klasse TagsViewController: UIViewController, UITableViewDelegate, UITableViewDataSource

haben

Vielleicht ist einer von euch angesichts dieser alle anderen Code war in Ordnung.

+0

Danke, habe denselben Fehler gemacht. Gelöst! –

+0

Welsome @HardikDarji –

Verwandte Themen