2012-09-30 84 views
9

我承认UITableview在用户滚动时动态加载单元格。我想知道是否有一种方法来预先加载所有单元格,以便在滚动时不加载每个单元格。我需要预先加载10个单元格。这可能吗?预加载uitableview的单元格

回答

11

您可以初始化表格视图单元格,将它们放入数组precomputedCells中,并在数据源委托方法tableView:cellForRowAtIndexPath:中返回数组中的预先计算的单元格,而不是调用dequeueReusableCellWithIdentifier:。 (你会在静态表视图做类似。)

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    return [self.precomputedCells objectAtIndex:indexPath.row]; 
} 

这也可能是有用的看看 WWDC 2012届211 “在iOS上构建并发用户界面”其中示如何在保持用户界面响应的同时填充后台线程中表格视图单元的内容。

+0

正如你所说的我的我的细胞保存到一个NSMutableArray。然后我通过[self tableView:tablefollow cellForRowAtIndexPath:indexPath1];一个接一个地预加载它们; 。在预加载时,uitableview不可见。在uitableview可见后,我注意到NSString * CellIdentifier = [NSString stringWithFormat:@“Cell%i-%i”,indexPath.section,[indexPath row]]; UITableViewCell * cell = [aTableView dequeueReusableCellWithIdentifier:CellIdentifier];给我零!我怎样才能克服这个问题?我猜是因为在预加载单元格时uitableview不可见。我对吗? – stefanosn

+0

@stefanosn:我的想法并不是全部使用'dequeueReusableCellWithIdentifier'。我已经相应地更新了答案。 - *也可能是我误解了你的问题*。我不认为你可以强制表视图实际*加载*所有单元格。即使您为所有单元格调用'[self tableView:... cellForRowAtIndexPath:...];'表视图可能会丢弃未使用的单元格。你只能预先计算所有单元格(如我的答案中所述),以便加载每个单元格的速度更快。 - 我希望这个对你有用。 –

+0

我想在uitableview上预加载单元格,以便我不必在 - (UITableViewCell *)tableView:(UITableView *)aTableView cellForRowAtIndexPath:(NSIndexPath *)indexPath中返回一个单元格,以便改进滚动。所以这不可能吧? – stefanosn

0

变化,当你正在重用表视图,否则将加载旧数据

9

我一直在寻找一个解决原来的问题,我想我会分享我的解决方案的dequeueReusableCellWithIdentifier。在我的情况下,我只需要预先加载下一个单元格(我不会理解为什么,但有一个很好的理由)。

看起来UITableView渲染尽可能多的单元格,以适应分配给它的UITableView框架。因此,我超过了UITableView框架的1个额外单元格的高度,将超大区域推到屏幕外(或者如果需要,它可能会被剪裁成UIView)。当然,这意味着当我滚动表格视图时,最后一个单元格将不可见(因为UITableView框架比它的超级视图大)。因此,我添加了一个额外的UIView到单元格高度的tableFooterView。这意味着当表格滚动到底部时,最后的单元格很好地位于其超级查看的底部,而添加的tableFooterView保持离屏。

这当然可以应用于任意数量的单元格。如果需要的话,甚至可以将UITableView框架加载到iOS最初计算的contentSize,然后添加一个相同大小的tableFooterView,从而将其应用于预加载所有单元格。

希望这可以帮助其他人解决同样的问题。

+0

这看起来不错。不幸的是,它不适用于分页表。 –

+0

预加载细胞的线索是您的解决方案! –

+0

这是迄今唯一的解决方案。尽管如果你知道你的表或集合视图的高度不会太大,这只是一个好主意,否则你最终会遇到内存和性能问题。 –

1

正如Mark所建议的那样,我还暂时改变了我的UITableView的高度,以便表视图创建足够的可重用单元。然后我重置我的表视图的高度,以便它在滚动时停止创建可重用的单元格。

为了实现这个目标,我创建这是默认设置为false帮手布尔:

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 
    } 
} 

随着该表视图的帮助比正常产生更多的可重复使用的初始细胞和滚动是平滑流畅,因为没有额外的细胞需要被创建。

-2

自动调整单元格的解决方案。改变“estimatedRowHeight”以较低的值

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    self.tableView.rowHeight = UITableViewAutomaticDimension; 
    self.tableView.estimatedRowHeight = 32; //Actual is 64 
} 

实际预测的高度是64。32用于添加更多的细胞再利用,避免滚动时落后开始

相关问题