webentwicklung-frage-antwort-db.com.de

Fehler beim Abrufen einer Zelle aus ihrer DataSource

Was stimmt nicht mit dem folgenden Code

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

    NSString *CellIdentifier  = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 

    cell.textLabel.text = @"hello";

    return cell;
}

Und 

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
    return 2;
}

aber ich bekomme konnte eine Zelle nicht aus ihrer dataSource beziehen

Die ganze Ausnahme ist 

*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'UITableView (<UITableView: 0x7ffe0b092800; frame = (0 97; 414 590); clipsToBounds = YES; autoresize = RM+BM; gestureRecognizers = <NSArray: 0x7ffe0acf3b10>; layer = <CALayer: 0x7ffe0aceb6e0>; contentOffset: {0, 0}; contentSize: {414, 88}>) failed to obtain a cell from its dataSource (<AllContactsViewController: 0x7ffe0ace60f0>)'

Ich habe Delegat und Datenquelle für die Tabellensicht festgelegt

58
Rishab

Ihr Fehler deutet darauf hin, dass cellForRowAtIndexPath aus irgendeinem Grund nil zurückgibt. Wenn Sie dies bestätigen möchten, setzen Sie einfach einen Haltepunkt nach Ihrem aktuellen Warteschlangenanruf: Ich denke, dass cell auf nil gesetzt ist.

Wenn Sie moderne Xcode-Vorlagen verwenden, bei denen Sie eine Prototypzelle für Sie erstellen lassen, sollten Sie stattdessen wahrscheinlich Folgendes verwenden:

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];

Wenn Sie keine Xcode-Vorlage verwenden, verwenden Sie diese Codezeile trotzdem und registrieren Sie Ihre eigene Wiederverwendungskennung wie folgt:

[self.tableView registerClass:[UITableViewCell self] forCellReuseIdentifier:@"Cell"];

Wenn alles gut ist, sollte das Problem gelöst werden. Ich habe dies für Swift-Benutzer genauer beschrieben.

72
TwoStraws

Mit Swift 3 bin ich auf diesen Fehler gestoßen, als ich vergessen hatte, der ViewController-Deklaration die Protokolle UITableViewDataSource und UITableViewDelegate hinzuzufügen.

klasse DataViewController: UIViewController, UITableViewDataSource , UITableViewDelegate

Durch das Hinzufügen wurde das Problem behoben.

147
David Reidy

Swift 3.0

Sie müssen lediglich UITableViewDelegate und UITableViewDataSource hinzufügen.

import UIKit

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource

Das untenstehende Bild dient nur als Referenz.

 enter image description here

43
Vivek

Sie müssen der Zelle eine Kennung geben. "Zelle" gibt den Bezeichner der Zelle wie im Attributinspektor der Zelle im Bezeichnerfeld ..__ an. Ich habe Ihren Fehler erneut erzeugt und es liegt daran, dass Sie Ihrer Zelle keinen Bezeichner gegeben haben.

In meinem Fall habe ich vergessen, UITableViewDataSource, UITableViewDelegate für UITableview zu deklarieren.

2
prakash singh

Ich hatte das gleiche Problem und es war, weil ich vergessen hatte, die Protokolle UITableViewDataSource und UITableViewDelegate zu implementieren

fügen Sie sie einfach nach der geerbten Klasse zu Ihrer Klassendeklaration hinzu

xcode muss mich davor warnen, da ich in meinem Code die Methoden UITableViewDataSource und UITableViewDelegate verwendet habe

2

Prüfen Sie, ob UITableViewDataSource hinzugefügt wurde. Ich habe das vermisst, so dass die App abstürzte

1
Urvish Modi

Stellen Sie sicher, dass Sie die Implementierung der Protokolle UITableViewDelegate und UITableViewDataSource nicht vergessen haben.

class ExampleViewController: UIViewController, UITableViewDelegate, UITableViewDataSource

1
Mohsin Qureshi

Bitte probieren Sie auch den untenstehenden Code

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
 {
    static NSString *CellIdentifier = @"Cell";
    // Reuse and create cell    
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }
    // Update cell data contents
    cell.textLabel.text = @"Your text here";
    [email protected]"Your detailed text label";

    return cell;
}
1
user3182143

Sie müssen die 'cellForRowAt'-Methode überschreiben. Pass auf dich auf, wenn du es nicht getan hast

0
oskarko

Möglicherweise verwenden Sie nicht dieselbe Kennung, die Sie im Hauptplatine für die Prototypzelle angegeben haben. Versuchen Sie, den Namen für Kleinbuchstaben in Großbuchstaben zu übertragen, um sicherzustellen, dass Sie die richtige Kennung verwenden.

Viel Glück:)

0

Wenn Sie Nib nicht laden, müssen Sie zuerst Nib in viewDidLoad registrieren. 

 [self.tableView registerNib:[UINib nibWithNibName:@"RecruitmentDetailViewC" bundle:nil] forCellReuseIdentifier:@"RecruitmentDetailViewC"];
0
GSK

in meinem Fall habe ich vergessen, von einem dynamischen Prototyp zu einer statischen Zelle zu wechseln. Überprüfen Sie diesen Teil in Ihrem Schnittstellenersteller

0
sarah

Nachdem ich die in den anderen Beiträgen vorgeschlagenen Schritte ausgeführt und überprüft hatte, ob meine Zelle null war, war mein Problem nicht gelöst, und meine Zelle wurde nicht als null angezeigt, als ich es überprüfte. Durch das Hinzufügen dieses praktischen Code-Snippets wurde das Problem jedoch behoben, sodass es an einem Punkt null gewesen sein muss, an dem ich es nicht verstanden habe. 

if (cell == nil)
{
    NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"ClassNameOfMyCustomCell" owner:self options:nil];
    cell = [nib objectAtIndex:0];
}
0
jungledev

Wenn Sie tableViewCell neben UITableView verwenden, müssen Sie die NIB selbst registrieren. Wenn die NIB nicht registriert ist, kann der Fehler "Fehler beim Abrufen einer Zelle aus ihrer DataSource" auftreten. Aus der Fehlerbeschreibung finde ich immer schwer herauszufinden, was falsch ist.

Dieser Fehler kann leicht durch die Registrierung behoben werden:

 [self registerNib:[customerButtonTableViewCell class]
     forCellReuseIdentifier:customerButtonCellIdentifier forTableView:tableView];
0
Vincent

Vorsicht bei der Migration
Wenn jemand seinen Code von älteren Swift-Versionen auf neuere migriert, kann dies auftreten, wenn Sie die Syntax der UITableViewDataSource-Funktionen nicht ungewollt in die neuere Swift-Syntax ändern.
Leider kann sich der Compiler nicht darüber beklagen.
Ich bin dem begegnet, als ich meinen Code von Swift 2 auf Swift 4 migrierte. Ich habe die Syntax der cellForRow DataSource-Methode nicht geändert von: 

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell   

zu seiner Swift 4-Version: 

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell  

und ich habe den Fehler bekommen: 

"Failed to obtain a cell from its DataSource"
0
Mehdi