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

Pet*_*ter 3 sqlite iphone uitableview

我有我的datasource(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];
}
Run Code Online (Sandbox Code Playgroud)

如果您需要了解其他可能有助于清理的事情,请告诉我.

Owe*_*ett 7

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


Oma*_*wan 7

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

所以要解决这个问题,只需添加

self.tableView.estimatedRowHeight = 100 // or your estimate 
Run Code Online (Sandbox Code Playgroud)