UITableView willDisplayCell - 一些奇怪的事情正在发生

时间:2011-10-11 14:49:32

标签: iphone sqlite uitableview

我的数据源(productsArry)是通过SQLite填充的,我一次只能获取25个项目。我正在调用'willDisplayCell'UITableView委托,当indexPath.row等于productsArry计数时,它将获取新数据并重新加载表视图。这很好用没有问题,但是假设数据源有100个对象,这些对象正在tableview中显示,然后productsArry已经用较少的对象(比如50)进行过滤并执行reloadData,这很好,但是问题在willDisplayCell委托中。出于某种原因,在没有用户滚动的情况下调用此方法。因此它认为单元格25已经滚动,所以现在它将从数据库中获取下一组行。它将继续执行此操作,直到它从最后一组数据到达100个对象,或者从过滤器中获取其他任何内容。

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell    forRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (([self.productsArry count] != 0) && (indexPath.row == [self.productsArry count])) 
    {
        self.currentOffset += TableviewRowCount;
        [self performSelector:@selector(reloadTableView:) withObject:nil afterDelay:0.2];
    }
}

- (void)reloadTableView:(id)sender
{
    NSLog(@"reloadtable");
    [self fetchData];
    [self.productTableView reloadData];
}

如果您需要了解其他可能有助于解决问题的事情,请告诉我。

2 个答案:

答案 0 :(得分:7)

当你调用reloadData时,你正在做的是重新加载整个表格,单元格和所有表格。这就是为什么willDisplayCell被调用 - 它将被调用所有可见的单元格。当时这样做可能不是一个好主意。你想要做的只是重新加载一个新的表的一部分 - 看看reloadRowsAtIndexPaths:withRowAnimation:而不是。大多数应用程序在到达列表末尾时都不会自动获取,他们将最后一个单元格作为按钮,或者要求用户退回列表(Facebook)以添加更多内容。

答案 1 :(得分:2)

我发现这里的主要问题是表格不知道单元格的高度,因此假定默认的操作系统,并且该单元格将被禁用,在表格计算布局后它将获得正确的高度。

因此,要解决此问题,只需添加

self.tableView.estimatedRowHeight = 100 // or your estimate