我有一个collection view
有三个不同的单元格。每个单元格包含table view
。所以,有三个table view
。我为每个人设置了标签(从1到3)。
现在,在我的view controller
上(我将table view
data source
的{{1}}列为collection view
时,我呼叫table view
的{{1}} data source
1}}行数的方法。为了区分table view
我检查每个人的标签。这是代码:
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
switch tableView.tag {
case 1:
if unitItems1 != nil {
return unitItems1!.count
} else {
return 0
}
case 2:
if unitItems2 != nil {
return unitItems2!.count
} else {
return 4
}
case 3:
if unitItems3 != nil {
return unitItems3!.count
} else {
return 4
}
default:
return 0
}
}
问题是,当显示collection view
的第一个单元格(第一个table view
)时,它可以正常工作。但是当我滚动到第二个单元格时,两个case 2
和case 3
都被执行了。之后,第二个table view
按预期显示数据,但是当我滚动到第三个时,该方法不会被调用。
我无法弄清楚为什么一个接一个地调用两个case
语句,而第一个单元格的一切都正常。如果您有任何想法,为什么会发生这种情况(或者,您可能建议更好地检查table view
),我将非常感谢您的帮助。
答案 0 :(得分:0)
实际上,解决方案非常简单。问题的原因是collectionView
的数据源方法一个接一个地将所有单元格出列,即使它们不在屏幕上也是如此。因此,每个单元格中的tableView
也被设置了。因此,他们的数据源方法被调用,因此问题。
UICollectionView
有一个名为isPrefetchingEnabled
的属性。根据文档,它表示是否启用了单元格和数据预取。
文档说:
如果为true,则集合视图会在显示它们之前请求单元格,将渲染分布在多个布局过程中。如果为false,则在显示时需要单元格,通常在同一渲染循环中请求多个单元格。将此属性设置为false也会禁用数据预取。此属性的默认值为true。
因此,要解决问题中描述的问题,我会在false
设置后立即将其设置为collectionView
。