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

Posted

技术标签:

【中文标题】重用自定义 tableView 单元格时重复显示相同的子视图(Swift 4.1)【英文标题】:Same subview shows repeatedly when custom tableView cell reused (Swift 4.1) 【发布时间】:2018-03-20 17:45:31 【问题描述】:

当我在我的自定义 tableView 单元格中绘制一组 CGRect 时遇到问题,当单元格被重用时它们会重复显示,这不是我想要的。

这是我的 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 项目中的 numberOfBlock 属性绘制每个单元格,但是当单元格被重用时,块不会重绘... 我已经尝试在这里和其他地方搜索,但我找不到答案(很长一段时间),我是 swift 新手,请多多包涵……非常感谢。

注意: 项目类包括 2 个属性: 1. itemTitle:字符串, 2. numberOfBlocks: Int

【问题讨论】:

看起来你正在添加子视图每次你出列一个单元格。您需要重新使用它们,或者在添加新的之前删除它们。 【参考方案1】:

我相信您遇到了这个问题,因为 let block = UIView() 在重用时没有从单元格中删除。如果是的话,你可以试试这个策略:

    在你CustomTableViewCell类中保持每个let block = UIView(); 实现prepareForReuse()方法并从superview中删除所有blocks。

此步骤保证重用的单元格没有任何来自先前状态的块。

一点实现:

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)
        
    


【讨论】:

非常感谢!我只是在 5 分钟前弄清楚...,我通过将我的 CGRects 转换为一个新类来删除了 cellForRowAt 函数中的块,并删除了该类中的所有 subView ......但是你用我没有的新方法启发了我没想到,谢谢

以上是关于重用自定义 tableView 单元格时重复显示相同的子视图(Swift 4.1)的主要内容,如果未能解决你的问题,请参考以下文章

Swift - uitableview 重用单元格时用户输入混淆?

重用的 tableView 单元格不调用 layoutSubviews 方法

为啥在制作自定义表格视图单元格时将可重用单元格出列两次

带有两个自定义单元格的 TableView 导致单元格重用问题(Swift 4)

重用 UICollectionView 中的单元格时,会短暂显示重用 UICollectionViewCell 的旧内容

如何在使用tableViews自定义单元格时在运行时更改表视图单元格高度?