parse.com PFQueryTableViewController gibt dasselbe Objekt mehrmals zurück
-
20-12-2019 - |
Frage
Ich versuche es zu verwenden (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath object:(PFObject *)object
um die Anzeige anzupassen PFObject
Daten in einem PFQueryTableViewController
.Also konstruiere ich meine PFQuery
Objekt hinein (PFQuery *)queryForTable
in meinem PFQueryTableViewController
delegate
das soll die mehreren Objekte in einem erhalten NSArray
.
Ich dachte, dass parse.com dann senden/anrufen soll (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath object:(PFObject *)object
einmal für jedes der zurückgegebenen Objekte.Ich finde jedoch, dass es immer wieder zurückkehrt Dasselbe Objekt mehrmals.
Also zum Beispiel statt 3 verschiedenen Objekten für die 3 Zeiten (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath object:(PFObject *)object
aufgerufen wird, erhalte ich das gleiche Objekt.Aber es ist kein Problem mit den Daten oder der Abfrage, denn am Ende von (PFQuery *)queryForTable
, kurz bevor
return query;
Ich habe es versucht
[query findObjectsInBackgroundWithBlock:^(NSArray *resultsNow,NSError *error) {NSLog(@"We have the following: %@", resultsNow);}];
sleep(5);
und dies zeigt die 3 korrekt erhaltenen Objekte.Wie kommt es, dass das genau ist Dasselbe Abfrage bei Bearbeitung durch PFQueryTableViewController
Berufung (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath object:(PFObject *)object
3 Mal, anstatt die 3 Objekte einzeln zu senden, sendet es das erste 3 Mal?
Als Antwort auf Wains Fragen habe ich einige Antworten in den Kommentaren hinzugefügt, aber auch das Folgende scheint relevant zu sein:
- (PFObject *)objectAtIndex:(NSIndexPath *)indexPath {
// overridden, since we want to implement sections
if (indexPath.section < self.objects.count) {
return [self.objects objectAtIndex:indexPath.section];
}
return nil;
}
Lösung 2
Dank Wains Frage habe ich ObjekteDidLoad protokolliert:und stellte fest, dass die richtigen 3 Objekte geladen wurden, also musste es daran liegen, dass der PFQueryTableViewController sie einfach nicht in der richtigen Reihenfolge geladen hat (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath object:(PFObject *)object
.
Insbesondere sollte die Zuordnung erfolgen -(PFObject *)objectAtIndex:(NSIndexPath *)indexPath
wie in meiner Frage angegeben.Aber als ich mir die Dokumentation zum N-ten Mal ansah, fiel mir plötzlich auf, dass der Methodenname eigentlich lauten sollte -(PFObject *)objectAtIndexPath:(NSIndexPath *)indexPath
.Kein Wunder, dass es nicht aufgerufen wurde, meine Zuordnung in Kraft trat und daher an das falsche Objekt übergeben wurde (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath object:(PFObject *)object
.Als ich es geändert habe -(PFObject *)objectAtIndexPath:(NSIndexPath *)indexPath
, das Problem ist verschwunden!
Wie könnte ich den falschen Methodennamen erhalten haben?Ich habe festgestellt, dass ich dieses Zuordnungsbeispiel aus dem Anypic-Code kopiert hatte. Ich vermute also, dass parse.com den Methodennamen irgendwann nach dem Schreiben von Anypic geändert hat?Kann das jemand verifizieren?Ich verwende das Parse-Framework 1.2.14
Andere Tipps
Ich hatte ein ähnliches Problem und was ich getan habe war:
1 - Anstatt zu verwenden PFQueryTableViewController
einfach normal verwenden UITableViewController
.
2 - Ändern Sie die Methode queryForTable:
Zu (void)
.
- (void)queryForTable {
3 - Löschen PFQueryTableView
Methoden anwenden und umsetzen DataSource
Methoden.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
}
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
}
Anruf [self queryForTable]
In viewDidLoad
nachdem es in der .h-Datei deklariert wurde.
Wenn Sie keinen Block verwenden, erstellen Sie ihn einfach NSArray
property
und weiter bevölkern queryForTable
:
self.yourarray = [query findobjects];
Wenn Sie einen Block verwenden, stellen Sie sicher, dass Sie ihn ausfüllen NSArray
Innerhalb des Blocks und Tabellenansicht neu laden.
[query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
if (error) {
// There was an error, do something with it.
}
else {
self.yourArray = objects;
}
// Reload your tableView Data
dispatch_async(dispatch_get_main_queue(), ^{
[self.tableView reloadData];
});
}];
So habe ich es zum Laufen gebracht.Ich hoffe es hilft.