2014-01-08 6 views
1

Я пытаюсь использовать (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath object:(PFObject *)object для настройки отображения PFObject данных в PFQueryTableViewController. Поэтому я создаю свой объект PFQuery в (PFQuery *)queryForTable в моем PFQueryTableViewControllerdelegate, который должен получить несколько объектов в NSArray.parse.com PFQueryTableViewController возвращает один и тот же объект несколько раз

Я думал, что 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 раза?

В ответ на вопросы WAIN, я добавил некоторые ответы в комментариях, но и следующий представляется актуальным:

- (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; 
} 
+1

Какие указательные пути отправляются? Что предоставляет 'objectsDidLoad:'/доступно в 'objects'? – Wain

+0

Спасибо, Уэйн, за хороший вопрос. На первый взгляд кажется, что objectsDidLoad: просто вызывает супер и прочее вроде 'self.tableView.tableHeaderView = nil;' и 'self.tableView.scrollEnabled = YES;' это не должно меняться, но я буду исследовать что более. – auspicious99

+0

Что касается указательных путей, они (в порядке, 1, 2 и 3 раза), ' 2 индекса [0, 0]', ' 2 индекса [1, 0]' и ' 2 индекса [0, 0] ' – auspicious99

ответ

1

С помощью вопроса Wain я зарегистрировал объекты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? Может ли кто-нибудь проверить это? Я использую parse framework 1.2.14

2

У меня был подобный вопрос, и что я сделал:

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.

Если вы не используете блок, вы просто создать NSArrayproperty и заполнить на queryForTable:

self.yourarray = [query findobjects];

Если вы используете блок, убедитесь, что вы заполнить NSArray внутри блока и перезагрузить TableView.

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

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

+1

Спасибо, Хорхе, но я бы предпочел, чтобы PFQueryTableViewController работал, если это возможно, поскольку он поставляется с некоторыми другими удобствами. – auspicious99

Смежные вопросы