UITableViewCells隐身

时间:2017-01-28 07:43:03

标签: ios uitableview swift3 xcode8

要求:

我有UITableviewCell的{​​{1}}列表,我在nib上展示了UITableview。我第一次打开UIViewController所有单元格都正确显示并按预期工作。

问题:

如果我导航回父母,然后再次打开UIViewControllerUITableviewCell将无形'。我说不可见,因为在cellForRowAt中有一个断点我可以看到表视图确实加载了所有单元格并且单元格是有效的。

代码:

func numberOfSections(in tableView: UITableView) -> Int {
    return 1
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return 13
}
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    return 40
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = (project?.sliderData.sliders[indexPath.row].view)! as UITableViewCell
    print(cell.contentView.subviews.count)
    if let left = cell.viewWithTag(2) as? UILabel {
        left.text = "left"
    }
    if let middle = cell.viewWithTag(3) as? UILabel {
        middle.text = "middle"
    }
    if let right = cell.viewWithTag(4) as? UILabel {
        right.text = "right"
    }
    return cell
}

屏幕截图

enter image description here

预期观察:

我原以为subviews的{​​{1}}可能会被释放,因为我在cells中没有对它们进行任何绑定。为了测试这一点,我打印子视图的数量并将一些文字写入IB subview。一切似乎都很顺利,细胞被加载,标签就在那里,但细胞不会出现。

但是,如果我向上和向下滚动labels以更新某些单元格,那么这些单元格会出现在视图的顶部和底部,如图所示。

2 个答案:

答案 0 :(得分:0)

您需要在代码中调用dequeueReusableCell(withIdentifier: "cell"),然后显示您的表格单元格。它将为您的所有行数据内容重用单元格。

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
   let cell = tableView.dequeueReusableCell(withIdentifier: "cell") as! UITableViewCell
   return cell
}

更多详情:How to create uitableview with multiple sections in iOS Swift.

答案 1 :(得分:0)

没有找到tableView的行为方式,所以我通过出列默认单元格来解决问题。滑块对象提供的视图将作为子视图添加到出列单元格中。现在,子视图当然可以是任何UIViews。

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    var cell = tableView.dequeueReusableCell(withIdentifier: "sliderCell")
    if cell == nil {
        cell = UITableViewCell.init(style: .default, reuseIdentifier: "sliderCell")
    }
    cell?.addSubview((project?.sliderData.sliders[indexPath.row].view)!)
    return cell!
}