2 Stimmen

cellForRowAtIndexPath wird bei tableView reloadData nicht aufgerufen

Ich habe eine UITableView auf eine Ansicht, die in Daten zu Beginn der Anwendung lädt, und dann später, wenn ein Benutzer Text in ein Feld eingibt und eine Schaltfläche drückt, ich die Datenbank neu abfragen, neu füllen das ursprüngliche NSMutableArray, das die Daten für die Tabelle speichert.

All das funktioniert perfekt. In einigen Logging-Anweisungen kann ich sagen, dass das Array die richtigen Informationen hat, die numberOfRowsInSection-Methode die richtige Anzahl zurückgibt und nach dem Reload aufgerufen wird.

Die Funktion cellForRowAtIndexPath wird jedoch beim zweiten Mal (nach dem Neuladen) nicht mehr aufgerufen, und die Tabellendaten werden nicht mehr aktualisiert.

Ich habe stundenlang im Netz gesucht und nichts gefunden, was hilft. Kann jemand helfen?

Der gesamte Code befindet sich unter: http://github.com/botskonet/inmyspot

Der spezifische Reload wird an aufgerufen: http://github.com/botskonet/inmyspot/blob/master/Classes/InMySpotViewController.m

Ungefähr Linie 94

Von: http://github.com/botskonet/inmyspot/blob/master/Classes/PlateFormViewController.m

Ungefähr Linie 101

Ein bisschen mehr Info: Sobald die neuen Daten zu dem mutablearray hinzugefügt wurde, wenn ich versuche, die Tabelle zu blättern, stirbt es schließlich mit:

"Beenden der Anwendung aufgrund einer nicht abgefangenen Ausnahme 'NSRangeException', Grund: '*** -[NSCFArray objectAtIndex:]: index (29) beyond bounds (29)'"

Ich nehme an, das bedeutet, dass die Tabellenzellen keine Daten im Array finden können, die mit der Bildlaufposition übereinstimmen, was daran liegt, dass das Array die neuen Daten hat, die Tabelle aber nicht.

3voto

commanda Punkte 4813

Ich hatte das gleiche Problem. Mein Problem war ähnlich: Ich habe eine UIViewController-Unterklasse (MyViewController) die ein paar Dinge enthält, darunter einen Verweis auf meine Unterklasse von UITableViewController (MyTableViewController) . Unter MyViewController.xib um sicherzustellen, dass die tableView, die von der MyViewController ist derselbe wie derjenige, der in MyTableViewController In Interface Builder habe ich die Referenz von der tableView in MyViewController und machte darauf aufmerksam, dass MyTableViewController's Eigentum ansehen.

Hier ist ein Bild, da Aktionen in Interface Builder so schwer zu beschreiben sind: enter image description here

1voto

Jordan Punkte 21708

Ihr Reload wird nicht aufgerufen, weil Sie Ihre Delegierten für UITableView nicht richtig eingerichtet haben.

@interface InMySpotViewController : UITableViewController <UITableViewDelegate, UITableViewDataSource>{
}

Auch hier überschreiben Sie mainDelegate.plates:

NSMutableArray *platesArray = [[NSMutableArray alloc] init];
                mainDelegate.plates = platesArray;
                [platesArray release];

Warum kombinieren Sie nicht Ihre beiden Controller. Die Art und Weise, wie Sie es tun, führt zu den meisten Ihrer Probleme. Sie erstellen eine neue InMySpotViewController unnötig in PlateFormViewController.

1voto

Darren Punkte 25326

Unter plateLookup wird die vorhandene Anordnung zerschlagen:

    NSMutableArray *platesArray = [[NSMutableArray alloc] init];
    mainDelegate.plates = platesArray;
    [platesArray release];

Danach laden Sie die Tabelle neu. Das Array hat null Elemente, also cellForRowAtIndexPath: wird nie aufgerufen.

Bearbeiten: Sie erstellen auch einen neuen View-Controller

        InMySpotViewController *viewController = [[InMySpotViewController alloc] init]; 
        [viewController refreshTable];

Sie laden also nicht einmal die Tabelle neu, die auf dem Bildschirm zu sehen ist.

1voto

helion3 Punkte 30495

Dank der Fehlersuche eines Familienmitglieds habe ich die folgenden Probleme als Ursache ausgemacht:

En inMySpotViewController wurde als UITableViewController nicht ein UIViewController Deshalb hat der Tisch alles andere verdeckt. Ich änderte ihn in einen UIViewController und fügte dann eine neue UITableView :

IBOutlet UITableView *myTblView;
@property (nonatomic, retain) UITableView *myTblView;

Und dann referenzierte ich diese Tabellensicht in meinem gesamten Code. Dieser Code wurde in der Single-View-Verzweigung erstellt, so dass er jetzt richtig funktioniert.

Die platesArray gehalten wird als ein Problem erwähnt, aber es ist nicht, weil die außerhalb der Grenzen geschah, weil das Array erfolgreich aktualisiert wurde, während die Tabelle Ansicht nicht war (so ich versuchte, zu einem Index im Array zu blättern, die nicht vorhanden war, aber ich wusste, dass das Problem war, da Sie Tabelle nicht visuell aktualisieren).

Ich hatte den Inhalt des überarbeiteten plates-Arrays erfolgreich ausgeloggt, nachdem ich seine Werte neu geschrieben hatte, und sie waren alle korrekt, und plates.count gab die richtigen Werte zurück, also wurde es nicht in irgendeiner Weise "verprügelt".

Vielen Dank an alle für die Hilfe!

0voto

Chris Fox Punkte 601

Ich hatte das gleiche Problem, und ich verfolgte es zu mit einer tableView-Eigenschaft in der Schnittstelle. Ich glaube nicht, dass ich diese selbst hinzugefügt habe, aber was soll's, sie hat die eigene tableView-Eigenschaft des UITableViewControllers verdeckt. Ich entfernte es, das Projekt weiterhin zu bauen, aber jetzt, wenn ich von der geschobenen Viewcontroller zurück zum ersten UITableViewController zurückkehren, die richtige Sequenz geschieht.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X