重复使用自定义tableView单元格时重复显示相同的子视图(Swift 4.1)

时间:2018-03-20 17:45:32

标签: ios swift uitableview subview

当我在自定义tableView单元格中绘制一组CGRects时出现问题,它们在重复使用单元格时反复显示,这不是我想要的。

这是我的tableView控制器中的tableView(cellForRowAt indexPath :)函数:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    let cell = tableView.dequeueReusableCell(withIdentifier: "ItemCell", for: indexPath) as! CustomTableViewCell

    cell.addBlock(item: itemArray[indexPath.row])

    cell.itemTitle.text = itemArray[indexPath.row].itemTitle

    return cell
}

这是我的CustomTableViewCell类中的函数:(使用xib文件创建)

func addBlock(item: Item) {
    for i in 0 ..< item.numberOfBlocks {
        let block = UIView()
        block.frame = CGRect(
            origin: CGPoint(
                x: CGFloat(i) * 10,
                y: 0
            ),
            size: CGSize(
                width: 10,
                height: bounds.size.height
            )
        )
        block.backgroundColor = UIColor.orange
        self.addSubview(block)
    }
}

我想我会根据itemArray Items中的numberOfBlock属性绘制每个单元格,但是当重复使用单元格时,这些块不会重绘... 我曾在这里和其他地方尝试过搜索,但是我找不到答案(很长一段时间),我是新手,请耐心等待...非常感谢你。

注意: Item类包括2个属性: 1. itemTitle:String, 2. numberOfBlocks:Int

1 个答案:

答案 0 :(得分:0)

我相信您遇到此问题,因为let block = UIView()在重用时未从单元格中删除。如果是,您可以尝试这种策略:

  1. 保留let block = UIView()课程中的每个CustomTableViewCell;
  2. 实施prepareForReuse()方法并从superview中删除所有block
  3. 此步骤可确保重用的单元格不具有以前状态的任何块。

    一点实施:

    final class CustomTableViewCell: UITableViewCell {
    
        private var blocks: [UIView] = []
    
        override func prepareForReuse() {
            super.prepareForReuse()
    
            blocks.forEach { $0.removeFromSuperview() }
            blocks = []
        }
    
        func addBlock(item: Item) {
            for ... {
                let block = UIView()
                ...
                blocks.append(block)
            }
        }
    
    }