dequeueReusableCell方法返回新的或可重用的对象?

时间:2018-02-20 20:09:47

标签: ios uitableview

无法理解UITableview调用" dequeueReusableCell"方法。如何在UITableview中发生出列过程? 我们是否可以获得可重复使用的单元格或总是获得新的单元格?

3 个答案:

答案 0 :(得分:1)

这是一个非常简单的机制。当您通过调用tableViewcollectionView(或dequeueReusableCell)询问可重复使用的单元格时,只有两种情况:

  1. 队列中没有可以返回的可重用单元格(所有现有单元格都可见,因此无法重复使用) - tableView必须通过调用init(style: UITableViewCellStyle, reuseIdentifier: String?)来创建新单元格并返回此新单元格实例。

  2. 之前由同一reuseIdentifier注册的一些先前可见的单元格已经离开了屏幕,现在正在队列中等待。 tableView可以至少返回一次使用过的单元格,并且不必创建新实例(实例化新单元格在性能方面效率较低)。

  3. 非常简单 - 你唯一需要意识到的是,当保留tableView时,它将保留作为可重复使用单元格出列的单元格。因此,当一些可重用的单元格离开屏幕时,它不会被释放但仍然存在于内存中,而tableView会将其保留在队列中,以便下次调用dequeueReusableCell时可以返回它。 / p>

    现在如果你意识到这一点,你也应该意识到,如果你在离开屏幕后没有清理你的资源,那么你以后可能会遇到一些丑陋的问题 - 例如,在一个单元格上调用异步大图像下载可以只有在重复使用单元格后才能完成 - 旧图像将显示在应该呈现新单元格的单元格上。全部是因为您没有取消prepareForReuse中的下载。

答案 1 :(得分:0)

你会得到一些单元格与表格可见部分的高度相等,表示单元格高度为100,tableView高度为500,当你滚动显示在底部的新单元格时,你将获得5个单元格将隐藏的一个列在顶部

答案 2 :(得分:0)

将细胞视为中国板块,将您的内容视为食物。因此,在您的餐厅,您只能在给定时间内最多显示20个盘子。但是,根据时间的不同,您需要100种食物来展示它们。因此,对于你这样做,你不需要100个瓷盘,你只需要20个,当你想要展示新食物时,你要做的就是取出旧食物并将新食物放在同一个盘子上。

细胞以相同的方式出列。就像板块一样,当你只需要在给定时间显示20个时,你不需要100个单元格。您可以在同一个单元格上放置不同的内容。如果你有100个盘子,它会更贵,更重,就像你有100个细胞需要大量内存而且它很重。

enter image description here

如果你能看到这里的图片,

  • 食物1 - 食物20是您的数据来源。
  • 两种情况下的平板都是相同的。
  • 位置是行号,只是计数器

这是它发生的基本方式。实际的tableview工作有点不同,以保持一些阈值。

如果您想了解细胞重复使用的工作方式,可以在线获得更好的解释。如果您愿意,可以查看这些链接。

Apple guide

Good read