检查表视图标记时,切换一个接一个地调用多个案例

时间:2018-03-13 15:14:47

标签: ios swift uitableview switch-statement

我有一个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 2case 3都被执行了。之后,第二个table view按预期显示数据,但是当我滚动到第三个时,该方法不会被调用。

我无法弄清楚为什么一个接一个地调用两个case语句,而第一个单元格的一切都正常。如果您有任何想法,为什么会发生这种情况(或者,您可能建议更好地检查table view),我将非常感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

实际上,解决方案非常简单。问题的原因是collectionView的数据源方法一个接一个地将所有单元格出列,即使它们不在屏幕上也是如此。因此,每个单元格中的tableView也被设置了。因此,他们的数据源方法被调用,因此问题。

UICollectionView有一个名为isPrefetchingEnabled的属性。根据文档,它表示是否启用了单元格和数据预取。 文档说:

  

如果为true,则集合视图会在显示它们之前请求单元格,将渲染分布在多个布局过程中。如果为false,则在显示时需要单元格,通常在同一渲染循环中请求多个单元格。将此属性设置为false也会禁用数据预取。此属性的默认值为true。

因此,要解决问题中描述的问题,我会在false设置后立即将其设置为collectionView