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;
}
War es hilfreich?

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 PFQueryTableViewMethoden anwenden und umsetzen DataSourceMethoden.

    - (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 NSArrayInnerhalb 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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top