在点击/同一行

时间:2017-06-28 21:22:03

标签: ios uitableview

这是我刚刚解决的一个错误,我想与社区分享,因为在搜索时我没有在网上找到任何答案,我问过的任何人都回答“嗯有趣......”但不知道发生了什么。

乍一看,我有一个tableView,显示了一些细胞,一些细胞只是空白。当我点击一个空白单元格时,内容将会显示(但直到点击一下)。

首先想到:这是一个数据问题,并且正在重新加载它。在创建和加载tableView之后,我尝试重新加载数据甚至各行,但这并没有解决问题。我还尝试将此调用分派给主队列,并在缺失/空白的indexPaths上调用setNeedsLayout

问题:我查看了调试器,我发现两个空白单元实际上确实存在,看起来它们应该看起来但是它们上面有一个空白单元 。没错,一排有两个单元,一个在另一排上面。

enter image description here

对于那些对细胞显示时的好奇心,我仍然不知道为什么会这样,但如果我敲击细胞,空白细胞就会落后。仍然会有两个单元格,但我现在可以看到自定义单元格,因为空白单元格在它后面。

  • numberOfCellsInRow正在返回正确的数字,4
  • view debugger显示6(4行,其中两行包含两个单元格)
  • 在视图调试器中查看内存图层次结构确认此表中有6个单元格

我看了cellForRowAtIndexPath虽然我注意到正在使用UITableViewCell(泛型),但它看起来还不错。对我来说很奇怪的是,这是在另一个没有问题的视图控制器(secondVC)上使用的相同设置。过了一段时间,我注意到了一些不同。

这是firstVC上的一般模式。空白的UITableViewCell覆盖了“customCell”,而“genericCell”是故事板上的标准UITableViewCell

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let genericCell = tableView.dequeReusableCell(withIdentifier: "genericCell")
    if indexPath = IndexPath(row:0, section:0) {
         if let customCell = self.dequeueReusableCell(withIdentifier: "myCustomCell") as? MyCustomCell {
        return customCell
        }
    } else if indexPath = IndexPath(row:1, section:0) {
        genericCell.titleLabel.text = "cell1"
    } else if indexPath = IndexPath(row:2, section: 0) {
        genericCell.titleLabel.text = "cell2"
    }

    return genericCell
}

现在secondVC上的不同之处是第一行:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let genericCell = UITableViewCell(style: UITableViewCellStyle.subtitle, reuseIdentifier: "genericCell")
    if indexPath = IndexPath(row:0, section:0) {......

我仍然不确定这是否是iOS / Xcode错误或者是否有合理的解释,但解决方案是仅在创建并返回customCells之后创建“genericCell”,如下所示:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    if indexPath = IndexPath(row:0, section:0) {
         if let customCell = self.dequeueReusableCell(withIdentifier: "myCustomCell") as? MyCustomCell {
        return customCell
        }
    } else {
        let genericCell = tableView.dequeReusableCell(withIdentifier: "genericCell")
        if indexPath = IndexPath(row:1, section:0) {
            genericCell.titleLabel.text = "cell1"
        } else if indexPath = IndexPath(row:2, section: 0) {
            genericCell.titleLabel.text = "cell2"
        }
        return genericCell
    }
}

或通过init方法创建UITableViewCell而不是从故事板中将其出列 - 因为它在secondVC上没有错误。

1 个答案:

答案 0 :(得分:0)

我仍然不确定这是否是iOS / Xcode错误或者是否有合理的解释,但解决方案是仅在创建并返回customCells之后创建“genericCell”,如下所示:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    if indexPath = IndexPath(row:0, section:0) {
         if let customCell = self.dequeueReusableCell(withIdentifier: "myCustomCell") as? MyCustomCell {
        return customCell
        }
    } else {
        let genericCell = tableView.dequeReusableCell(withIdentifier: "genericCell")
        if indexPath = IndexPath(row:1, section:0) {
            genericCell.titleLabel.text = "cell1"
        } else if indexPath = IndexPath(row:2, section: 0) {
            genericCell.titleLabel.text = "cell2"
        }
        return genericCell
    }
}

或通过init方法创建UITableViewCell而不是从故事板中将其出列 - 因为它在secondVC上没有错误。

如果有人解释为什么需要这样做,请发帖作为答案,我很乐意将您的答案作为公认的答案!