情景
我有一个应用程序从我的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}}
答案 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];
}
}
}