首先,我找不到与这个问题相关的SO的任何答案,我也不确定我的代码是如何工作的,或者我是否违反了reusable cell
规则。
场景:我有一个简单的tableView,它有30个单元格,每个单元格都有自己的ViewModel类,ViewModel存储在一个数组中,根据ViewModel的属性排序; var number: Int
,表示tableView必须始终显示正确排序的数据。
问题:
1.如果我传递一个ViewModel
给每个可重用的单元格,那么每个可重用的单元格如何记住要使用哪个ViewModel?因为每个单元格并没有停留在相同的位置上吗?(我的tableView显示的结果总是正确的)
1.自从我将a reference type ViewModel
传递给每个可重用单元格后,tableView是否创建了纯30个单元格而没有重用任何单元格?
代码:
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
Constant.dummyViewModels.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "TestTableViewCell", for: indexPath) as! TestTableViewCell
cell.config(Constant.dummyViewModels[indexPath.row])
return cell
}
1条答案
按热度按时间rjee0c151#
假设表格视图的高度允许在任何给定时间显示8个单元格。当您滚动时,屏幕顶部的一个单元格消失,底部出现一个单元格。
因此,表格视图必须创建至少8个单元格,每个单元格对应一个当前可见的单元格。例如,当您滚动时,底部出现一个新行,表格视图将重用顶部最近滚动出视图的单元格。然后,表格视图调用
cellForRowAt
,并使用一个索引路径表示底部的行。然后,使用适当的数据配置该单元格。当一个单元格在屏幕上时,它已经通过
cellForRowAt
进行了配置,表格视图只是在你滚动时上下移动视图。一旦它离开屏幕,它可以根据需要重新用于另一行。有了它,你的问题就可以得到回答:
1.每个可见单元格(本例中为全部8个单元格)在可见时都已为特定行配置。单元格“记住”哪个视图,因为它只显示上次配置的视图模型。
1.表格视图重用了单元格。它没有为30行创建30个单元格。例如,它只创建了8个单元格,因为这是可见行数所需的数量。它不关心您是否将视图模型传递给每个可见单元格。每个可重用单元格将使用您在
cellForRowAt
中给予的任何适当的视图模型进行配置。简而言之,您对表视图单元格的使用还不错,至少就您在问题中所展示的重用而言。