parse.com PFQueryTableViewController возвращает один и тот же объект несколько раз
-
20-12-2019 - |
Вопрос
Я пытаюсь использовать (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath object:(PFObject *)object
настроить отображение PFObject
данные в PFQueryTableViewController
.Поэтому я создаю свой PFQuery
объект в (PFQuery *)queryForTable
в моем PFQueryTableViewController
delegate
который должен получить несколько объектов в NSArray
.
Я думал, что parse.com должен затем отправить/вызвать (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath object:(PFObject *)object
один раз для каждого из возвращаемых объектов.Однако я обнаружил, что он продолжает возвращать такой же объект несколько раз.
Так, например, вместо 3 разных предметов 3 раза (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath object:(PFObject *)object
вызывается, я получаю тот же объект.Но это не проблема с данными или запросом, потому что в конце (PFQuery *)queryForTable
, незадолго до этого
return query;
Я пытался
[query findObjectsInBackgroundWithBlock:^(NSArray *resultsNow,NSError *error) {NSLog(@"We have the following: %@", resultsNow);}];
sleep(5);
и это показывает, что 3 объекта получены правильно.Как получается, что точное такой же запрос при обработке PFQueryTableViewController
звоню (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath object:(PFObject *)object
3 раза, вместо того, чтобы отправлять 3 объекта один за другим, он отправляет первый 3 раза?
В ответ на вопросы Уэйна я добавил несколько ответов в комментариях, но также представляется актуальным следующее:
- (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;
}
Решение 2
Благодаря вопросу Уэйна я зарегистрировал объектыDidLoad:и обнаружил, что загружаются правильные 3 объекта, так что это должно было быть связано с тем, что PFQueryTableViewController просто не загружал их в правильной последовательности в (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath object:(PFObject *)object
.
В частности, картографирование должно было быть в -(PFObject *)objectAtIndex:(NSIndexPath *)indexPath
как указано в моем вопросе.Но, просматривая документацию в N-й раз, я вдруг заметил, что имя метода на самом деле должно быть таким: -(PFObject *)objectAtIndexPath:(NSIndexPath *)indexPath
.Неудивительно, что его не вызывали, а мое отображение вступило в силу, и, следовательно, в него был передан не тот объект. (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath object:(PFObject *)object
.Когда я изменил его на -(PFObject *)objectAtIndexPath:(NSIndexPath *)indexPath
, проблема ушла!
Как я мог получить неправильное имя метода?Я обнаружил, что скопировал этот пример сопоставления из кода Anypic, так что я предполагаю, что parse.com изменил имя метода где-то после написания Anypic?Может ли кто-нибудь это проверить?Я использую структуру синтаксического анализа 1.2.14.
Другие советы
У меня была аналогичная проблема, и я сделал следующее:
1 - Вместо использования PFQueryTableViewController
просто используйте обычный UITableViewController
.
2 - Изменить метод queryForTable:
к (void)
.
- (void)queryForTable {
3 – Удалить PFQueryTableView
методы и реализовать DataSource
методы.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
}
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
}
Вызов [self queryForTable]
в viewDidLoad
после объявления этого в файле .h.
Если вы не используете блок, вы просто создаете NSArray
property
и заполнить на queryForTable
:
self.yourarray = [query findobjects];
Если вы используете блок, просто убедитесь, что вы заполнили NSArray
внутри блока и перезагрузите таблицу.
[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];
});
}];
Вот как у меня это заработало.Надеюсь, поможет.