我承认UITableview在用户滚动时动态加载单元格。我想知道是否有一种方法可以预加载所有单元格,以便在滚动时不加载每个单元格。我需要预加载10个细胞。这可能吗?
答案 0 :(得分:11)
您可以初始化表格视图单元格,将它们放入数组precomputedCells
,并在数据源委托方法tableView:cellForRowAtIndexPath:
中返回数组中预先计算的单元格,而不是调用dequeueReusableCellWithIdentifier:
。 (类似于在静态表视图中的操作。)
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
return [self.precomputedCells objectAtIndex:indexPath.row];
}
看看这个也可能有用 WWDC 2012 Session 211“在iOS上构建并发用户界面” 其中显示了如何在后台线程中填充表视图单元格的内容,同时保持用户界面的响应。
答案 1 :(得分:10)
我正在寻找原始问题的解决方案,我想我会分享我的解决方案。
在我的情况下,我只需要预加载下一个单元格(我不会理解为什么,但有充分的理由)。
似乎UITableView呈现的内容与适合分配给它的UITableView框架一样多。
因此,我通过1个额外单元格的高度来超大UITableView框架,将超大区域推到屏幕外(或者如果需要,它可以进入剪切的UIView)。当然,现在这意味着当我滚动表格视图时,最后一个单元格将不可见(因为UITableView框架比它的超级视图更大)。因此,我在tableFooterView中添加了一个额外的UIView来表示单元格的高度。这意味着当表格滚动到底部时,最后一个单元格很好地位于其超级视图的底部,而添加的tableFooterView仍然在屏幕外。
这当然可以应用于任何数量的细胞。如果需要,甚至可以通过将UITableView框架过大到iOS最初计算的contentSize,然后添加相同大小的tableFooterView来应用它来预加载所有单元格。
希望这可以帮助其他人解决同样的问题。
答案 2 :(得分:1)
正如Mark所建议的,我也暂时更改了UITableView的高度,以便表视图创建足够的可重用单元格。然后我重置表格视图的高度,以便在滚动时停止创建可重复使用的单元格。
为了实现这一点,我创建了一个默认设置为false的辅助bool:
var didPreloadCells = false
当我的表视图首次重新加载数据并因此创建了第一个可重用的单元格时,它被设置为true。
resultsHandler.doSearch { (resultDict, error) -> Void in
[...]
self.tableView.reloadData()
self.didPreloadCells = true
[...]
}
真正的技巧发生在我的viewDidLayoutSubviews方法中。在这里,我根据我的布尔值设置我的表视图的框架。如果还没有创建可重用的单元格,我会增加表格视图的框架。在另一种情况下,我设置了正常的框架
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
self.tableView.frame = self.view.bounds
if !didPreloadCells
{
self.tableView.frame.size.height += ResultCellHeight
}
}
在此帮助下,表视图创建了比正常情况更多的初始可重用单元格,并且滚动流畅且流畅,因为不需要创建其他单元格。
答案 3 :(得分:0)
重新使用表视图时更改dequeueReusableCellWithIdentifier,否则将加载旧数据
答案 4 :(得分:0)
自动化细胞的解决方案。将'estimatedRowHeight'更改为较低的值
- (void)viewDidLoad {
[super viewDidLoad];
self.tableView.rowHeight = UITableViewAutomaticDimension;
self.tableView.estimatedRowHeight = 32; //Actual is 64
}
实际估计高度为64. 32用于添加更多单元格以便重复使用,以避免在滚动开始时滞后