parse.com PFQueryTableViewController возвращает один и тот же объект несколько раз

StackOverflow https://stackoverflow.com//questions/21000605

  •  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];
    }); 
}];

Вот как у меня это заработало.Надеюсь, поможет.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top