【问题标题】:Switch calls multiple cases one after another when checking table view tag查表视图标签时切换调用多个case一个接一个
【发布时间】:2018-03-13 15:14:47
【问题描述】:

我有一个collection view,其中包含三个不同的单元格。每个单元格都包含一个table view。所以,有三个table views。我已经为它们中的每一个设置了标签(从 1 到 3)。 现在,在我的view controller 上(当我将collection view 的单元格出列时,我将其设置为table viewdata source)我调用table viewdata source 方法来获取行数。为了区分table views,我检查了每个人的标签。这是代码:

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's),我将非常感谢您的帮助。

【问题讨论】:

  • 与您的实际问题无关,但您可以通过将if/else 替换为return unitItems2?.count ?? 4 之类的内容来简化每个case
  • @rmaddy,感谢您的建议。我一定会改变那部分!
  • 我会验证 tableView 指针实际上是相同的。 numberOfRowsInSection 可能会执行不止一次,因为它被 UITableView 的多个实例调用,而不是像您认为的那样通过 switch 语句。
  • @Dare,抱歉,您所说的“tableView 指针”是什么意思?
  • 您的 collectionView 可能会使第 2 个和第 3 个单元格出列,因此您会收到一个对单元格 2 中表格的调用和另一个对单元格 3 中表格的调用(实际上是单元格 1 和 2,因为它是零基于)。

标签: ios swift uitableview switch-statement


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-07-26
    • 2014-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-31
    • 1970-01-01
    相关资源
    最近更新 更多