2009-12-29 12 views
18

Ich versuche, eine Utabview mit mehreren Abschnitten zu füllen. Dies ist mein Code:UITableView Probleme mit CellForRowAtIndexPath

static NSString *CellIdentifier = @"Cell"; 
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
if (cell == nil) { 
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; 
} 

case 1: 
[[cell textLabel] setText:[usersTeachers objectAtIndex:(indexPath.row+1)]]; 
return cell; 
break; 

ich diesen Fehler, wenn ich versuche, um die Ansicht zu laden:

2009-12-28 21:09:48.380 FSS[2046:207] *** Assertion failure in -[UITableView _createPreparedCellForGlobalRow:withIndexPath:], /SourceCache/UIKit/UIKit-984.38/UITableView.m:4709 
2009-12-28 21:09:48.381 FSS[2046:207] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'UITableView dataSource must return a cell from tableView:cellForRowAtIndexPath:' 

Das Array an diesen Index-Protokollen als legitime Zeichenfolge aber es gibt nicht die Zelle richtig . Daher lädt es nicht über diesen Punkt hinaus. Bitte helfen Sie.

Antwort

2

Nicht sicher, warum Sie "Fall 1:" da draußen ganz allein sitzen, aber wenn es ein Fall ist ANDERER als 1, wird dies durchfallen, und was auch immer danach kommt, wird zurückgegeben. Stellen Sie sicher, dass Sie IMMER eine Zelle zurückgeben.

+0

Ich verstehe. Ich habe eine komplette Switch-Anweisung eingerichtet. Ich habe nur die erste verwendet, um ein Beispiel zu geben, was vor sich ging. Es wird nicht ein anderer Fall ausgeführt, bevor es den Fehler gibt. –

2

Sie geben wahrscheinlich keine Zelle für indexPath.row == 0 zurück (Ihr 'Fall 1' ist verdächtig ...). Aber kann nicht sagen, es sei denn, Sie posten Ihre gesamte switch-Anweisung.

Versuchen Sie, 'Zelle' außerhalb Ihrer Switch-Anweisung zurückzugeben, Sie werden besser verstehen, was passiert. Sie werden dann keinen Assertionsfehler haben.

28

Es sieht für mich aus, dass Sie einen teilweise sichtbaren Schalter Fall haben, wo es eine Zelle für Fall 1 zurückgibt. Ihr Fehler lässt mich denken, dass Sie eine Null UITableViewCell einige Zweig in Ihrem Switch-Fall zurückgeben.

Stellen Sie sicher, dass alle Pfade aus diesem Schalter ein gültiges Objekt UITableViewCell zurückgeben.

Was geben Sie für den Fall 0 zurück? Mit anderen Worten: Was geben Sie für die erste Zeile zurück, die das UITableView anfordert? Hier

ist ein Beispiel von Code aus einem meiner Projekte, es könnte Ihnen einen guten Ausgangspunkt, um zu sehen, wohin du gehst falsch:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    static NSString *CellIdentifier = @"Cell"; 

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) { 
     cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; 
    } 

    NSInteger section = [indexPath section]; 

    switch (section) { 
     case 0: // First cell in section 1 
      cell.textLabel.text = [collectionHelpTitles objectAtIndex:[indexPath row]]; 
      break; 
     case 1: // Second cell in section 1 
      cell.textLabel.text = [noteHelpTitles objectAtIndex:[indexPath row]]; 
      break; 
     case 2: // Third cell in section 1 
      cell.textLabel.text = [checklistHelpTitles objectAtIndex:[indexPath row]]; 
      break; 
     case 3: // Fourth cell in section 1 
      cell.textLabel.text = [photoHelpTitles objectAtIndex:[indexPath row]]; 
      break; 
     default: 
      // Do something else here if a cell other than 1,2,3 or 4 is requested 
      break; 
    } 
    return cell; 
} 
+2

+1 Wie du sagst, fehlt dem Code mit Sicherheit der Standard: case oder gibt sonst auf einem Codepfad null zurück. –

+0

Bitte helfen Sie mir zu verstehen, warum geben wir wenn (Zelle == Nil) Wenn (Zelle == Nil) { Zelle = [[[UITableViewCell Alloc] InitWithStyle: UITableViewCellStyleDefault Wiederverwendung Identifikator: CellIdentifier] Autorelease]; } Wenn Zelle == Nil oder If (! Zelle), wird es nie in die Bedingung zum Erstellen einer Zelle gehen. –

+0

Wenn ich 1000 Wert habe, der von der Datenbank kommt, dann muss ich in diesem Fall 1000 Fall schreiben ?? –

2

prüfen bekam man

if (cell == nil) { 
     cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; 
    } 

in

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

Ok, wenn alle anderen Lösungen für diese Frage nicht funktionieren, stellen Sie sicher, dass der Cell Identifier für die Zelle der Tabellenansicht (im Storyboard) mit der Zellenkennung Sie in Ihrem tableviewdelegate Code verwenden:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath  *)indexPath 
{ 
    static NSString *CellIdentifier = @"CustomCell"; 

Die Zellenkennung in Ihrem Storyboard „CustomCell“ sein muss, diesen Code zu entsprechen.

-3

In meinem Fall war ich mit dem gleichen Fehler, weil ich die alloc/init fehlte:

if (cell == nil) { 
     cell = [[UITableViewCell alloc] init]; 

} 
+0

Wenn Sie sich den Code in der Frage ansehen, führt er eine Zuweisung durch, verwendet jedoch einen spezifischeren Initialisierer. – Abizern

+0

Dies wird nicht funktionieren, wie Sie möchten, @Abizer ist korrekt. –

Verwandte Themen