解析iOS SDK:PFQueryTableViewController的动态单元格高度,基于Query的结果

时间:2014-10-19 23:25:39

标签: ios objective-c parse-platform heightforrowatindexpath

情景

我有一个应用程序从我的parse.com数据库下载数据并将其显示到PFQueryTableViewController中。 PFQTVC有多个(6)原型单元,每个单元都有自己的reuseIdentifier,最重要的是它们自己的高度。我目前正在使用以下设计来查找每个indexPath.row ...

的正确高度

目前

在启用分页

之前有效

每个单元格都是唯一的,因为每个单元格显示不同类型的信息。所以我按照每个self.objects的独特品质检查每个-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { // \!/ -trouble maker PFObject *object = [self.objects objectAtIndex:indexPath.row]; NSString *orientation = object[@"orientation"]; NSNumber *height; if ([orientation isEqual: @"left"] || [orientation isEqual: @"right"]) { height = @400.0; } else if ([orientation isEqual: @"up"] || [orientation isEqual: @"down"]) { height = @500.0; } else if (blah blah blah) { //ect. } return [height floatValue]; }

objectsPerPage

这一切都有效。也就是说,在我启用分页之前。

启用分页时

与我的大多数应用程序一样,我需要能够分页数据,这就是我的工作。我将...reason: '*** -[__NSArrayM objectAtIndex:]: index 11 beyond bounds [0 .. 10]' 设置为10 - 问题是,当我向下滚动到第十个单元格并重新加载下一页时...

self.objects

原因

当它加载下一页时,heightForRowAtIndexPath中的NSNumber *height; if (indexPath.row > self.objects.count) { height = @50.0; } else { PFObject *object = [self.objects objectAtIndex:indexPath.row]; NSString *orientation = object[@"orientation"]; if ([orientation isEqual: @"left"] || [orientation isEqual: @"right"]) { //HAS COMMENTS if ([[object objectForKey:@"comments"]intValue] > 0) { height = @618.0; } else { //NO COMMENTS BUT HAS LIKES if ([[object objectForKey:@"likes"]count] > 0) { height = @398.0; } //HAS NOTHING else { height = @381.0; } } } else if ([orientation isEqual: @"up"] || [orientation isEqual: @"down"]) { if ([[object objectForKey:@"comments"]intValue] > 0) { height = @727.0; } else { if ([[object objectForKey:@"likes"]count] > 0) { height = @508.0; } else { height = @490.0; } } } return [height floatValue]; } 是一个NSArray,它没有加载新对象。这导致我的应用程序崩溃并让我非常沮丧。

问题

有人知道如何解决这个问题吗?

编辑

{{1}}

1 个答案:

答案 0 :(得分:1)

启用分页后,Parse在第11个单元格中添加“加载更多”单元格。但是在self.objects中没有第11个对象。您需要检查indexPath.row< self.objects.count并为Load More单元格返回不同的高度。

这可以防止该错误:

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {

    // \!/ -trouble maker
    if (indexPath.row== self.objects.count) return 40.0;

    PFObject *object = [self.objects objectAtIndex:indexPath.row];
    NSString *orientation = object[@"orientation"];

    NSNumber *height;

    if ([orientation  isEqual: @"left"] || [orientation  isEqual: @"right"]) {

        height = @400.0;
    }

    else if ([orientation  isEqual: @"up"] || [orientation  isEqual: @"down"]) {

        height = @500.0;
    }

    else if (blah blah blah) {

        //ect.
    }

    return [height floatValue];
}

当我为loadNextPage实现稍微延迟时,它工作得很好。必须有一个方法在正确加载之前尝试访问self.objects数组。

-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (indexPath.row >= self.objects.count)
    {
        // this method gets called when the cell is scrolling into view, but also when it's first added to the table view
        // we only care about the first case
        if ([tableView.indexPathsForVisibleRows containsObject:indexPath])
        {
            [self performSelector:@selector(loadNextPage) withObject:nil afterDelay:.2];
        }
    }
}