parse.com pfquerytableviewcontroller restituisce lo stesso oggetto più volte
-
20-12-2019 - |
Domanda
Sto cercando di utilizzare (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath object:(PFObject *)object
per personalizzare la visualizzazione dei dati PFObject
in un PFQueryTableViewController
. Quindi costruisco il mio oggetto PFQuery
in (PFQuery *)queryForTable
nel mio PFQueryTableViewController
delegate
che dovrebbe ottenere gli oggetti multipli in un NSArray
.
Ho pensato che Parse.com dovrebbe quindi inviare / chiamare (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath object:(PFObject *)object
una volta per ciascuno degli oggetti restituiti. Tuttavia, trovo che mantiene il restituzione del stesso oggetti più volte.
Pertanto, ad esempio, invece di 3 diversi oggetti per il 3 volte (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath object:(PFObject *)object
viene chiamato, ottengo lo stesso oggetto. Ma non è un problema con i dati o la query, perché alla fine del (PFQuery *)queryForTable
, appena prima
return query;
.
Ho provato
[query findObjectsInBackgroundWithBlock:^(NSArray *resultsNow,NSError *error) {NSLog(@"We have the following: %@", resultsNow);}];
sleep(5);
.
E questo mostra i 3 oggetti ottenuti correttamente. Come è che la query esatta stessa quando viene gestita da PFQueryTableViewController
Chiamata (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath object:(PFObject *)object
3 volte, invece di inviare i 3 oggetti uno per uno, invia il primo 3 volte?
In risposta alle domande di Wain, ho aggiunto alcune risposte nei commenti, ma anche il seguente sembra pertinente:
- (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;
}
. Soluzione 2
Grazie alla domanda di Wain, ho registrato oggettiDidarlo: e ho scoperto che i 3 oggetti corretti erano carichi, quindi doveva essere una questione di PFQueryTableViewController non lo caricando nella giusta sequenza in (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath object:(PFObject *)object
.
In particolare, la mappatura avrebbe dovuto essere in -(PFObject *)objectAtIndex:(NSIndexPath *)indexPath
come indicato nella mia domanda.Ma guardando la documentazione per l'Nth Time, improvvisamente ho notato che il nome del metodo dovrebbe effettivamente essere -(PFObject *)objectAtIndexPath:(NSIndexPath *)indexPath
.Non c'è da stupirsi che non venisse chiamato, e la mia mappatura stava entrando in vigore, e quindi l'oggetto sbagliato è stato passato a (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath object:(PFObject *)object
.Quando l'ho cambiato in -(PFObject *)objectAtIndexPath:(NSIndexPath *)indexPath
, il problema è andato via!
Come potrei avere il nome del metodo sbagliato?Ho scoperto che avevo copiato quell'esempio di mappatura dal codice Anypic, quindi suppongo che Parse.com abbia cambiato il nome del metodo qualche volta dopo che l'Anypic è stato scritto?Qualcuno può verificarlo?Sto usando Parse Framework 1.2.14
Altri suggerimenti
Ho avuto un problema simile e quello che ho fatto è stato:
1 - Invece di usare PFQueryTableViewController
usa semplicemente UITableViewController
regolari.
2 - Cambia il metodo queryForTable:
to (void)
.
- (void)queryForTable {
3 - Elimina generacodicitagcodemethods e implementare PFQueryTableView
methods.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
}
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
}
.
Chiama DataSource
in [self queryForTable]
dopo averlo dichiarato nel file .h.
Se non si utilizza il blocco, è appena creato viewDidLoad
NSArray
e popolati su property
:
queryForTable
Se si utilizza il blocco, assicurati di compilare il blocco self.yourarray = [query findobjects];
insidE e ricarica la tabella.
[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];
});
}];
.
Questo è il modo in cui ho capito.Spero che aiuti.