Meine App hat zwei Status: angemeldet und nicht angemeldet, und ich habe die folgende Architektur (stark vereinfacht):
- ViewController A, der ein Suchfeld und eine Tabellenansicht enthält.
- ViewController B, der zum Anmelden in der App verwendet wird.
Der Ablauf ist wie folgt:
- Der Benutzer ist nicht angemeldet.
- A wird auf den Stapel geschoben. In viewWillAppear
Ich überprüfe, ob der Benutzer angemeldet ist und wenn ja, wird eine asynchrone Netzwerkanforderung gestellt, und sobald dies erledigt ist, wird die Tabelle mit den Daten aus dem Netzwerk geladen. Da der Benutzer zu diesem Zeitpunkt jedoch nicht angemeldet ist, ist die Tabellenansicht leer.
- Der Benutzer tippt auf das Suchfeld. weil er nicht eingeloggt ist, wird B gedrückt (nach einer Bestätigung);
- er meldet sich erfolgreich in B an, drückt dann eine Taste, die B öffnet und A wieder anzeigt;
- zu diesem Zeitpunkt, weil er angemeldet ist, viewWillAppear
mache ich die asynchrone Anfrage;
- Wenn das erledigt ist, rufe ich reloadData
die Tabellenansicht auf.
Was mir auffällt ist, dass numberOfRowsInSection:
es aufgerufen wird und das richtige Ergebnis zurückgibt, danach jedoch cellForRowAtIndexPath:
NICHT aufgerufen wird und die Tabelle leer bleibt.
Ich habe geprüft und reloadData
wird im Haupt-Thread aufgerufen.
Irgendeine Idee was kann es sein? Weil es mich verrückt macht!
Danke,
S.
EDIT: Hier ist das asynchrone Codebit aus viewWillAppear
A.
if ([User isLoggedIn]) {
[self.asyncRequest fetchDataWithCompletionHandler:^(id response, NSError *error) {
[UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
if (error) {
[Utils displayError:error];
} else {
self.array = response;
self.isLoaded = YES;
[self.tableView reloadData];
[self.tableView setContentOffset:CGPointMake(0.0f, 0.0f) animated:NO];
}
}];
}
Ich habe überprüft, ob die asynchrone Anforderung erfolgreich abgeschlossen wurde und response
die richtigen Daten enthält (dies ist das Array , das zum Sichern der Anforderung verwendet wird UITableView
).
Danach reloadData
habe ich einen Haltepunkt eingefügt tableView:numberOfRowsInSection:
und dieser stoppt dort und gibt die richtige Anzahl von Elementen zurück array
. Danach wird der Haltepunkt in tableView:cellForRowAtIndexPath:
jedoch nie mehr erreicht.
tableView:cellForRowAtIndexPath:
nichtcellForRowAtIndexPath:
.