向单元格动态添加视图会在表格中产生问题

Posted

技术标签:

【中文标题】向单元格动态添加视图会在表格中产生问题【英文标题】:Add view dynamically to cells produce issues in table 【发布时间】:2018-04-06 17:01:11 【问题描述】:

我有这个功能:

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

        let cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier)!

        let label = UILabel(frame: CGRect(x: 100, y: 14, width: 400, height: 30))
        label.text = "\(data[indexPath.row])"
        label.tag = indexPath.row
        cell.contentView.addSubview(label)

        return cell
    

嗯,通过这个函数,我可以动态添加行列表。 为什么是动态的?因为,列数取决于数据。 不要把注意力放在那个上面。

列表有 244 个元素。 结果显示正常,但是一旦我开始滚动,我就会得到:

如何动态添加元素而不出现此错误?

【问题讨论】:

uitableview 在向下滚动时创建 10 个单元格重新创建单元格视图,您可以在 addsubview 之前使用 cell.contentView.removeFromSuperview() 或使用 cell.textLabel?.text 如果您将其添加为答案,我会将其标记为正确的@a.masri 【参考方案1】:

细胞被重复使用。您不断为每个单元格添加越来越多的标签。

正确的解决方案是创建一个包含所需标签的自定义单元格类。然后只需在cellForRowAt 中设置该标签的文本。不要在cellForRowAt 中创建和添加子视图。

但请记住,您可能只想使用UITableViewCell 提供的textLabel 属性。无需自定义单元格或您自己的标签。

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
    let cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier)!
    cell.textLabel?.text = "\(data[indexPath.row])"

    return cell

【讨论】:

【参考方案2】:

我找到了解决办法,希望对你有用!!!

您必须将此代码添加到您的cellForRowAt

for item in cell.contentView.subviews
    
        item.removeFromSuperview()
    

刚拿到单元格。

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
    let cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier)!

    for item in cell.contentView.subviews
    
        item.removeFromSuperview()
    

    let label = UILabel(frame: CGRect(x: 100, y: 14, width: 300, height: 30))
    label.text = "\(data[indexPath.row])"
    label.tag = indexPath.row

    let btn = UIButton(type: UIButtonType.custom) as UIButton
    btn.backgroundColor = UIColor.red
    btn.setTitle("boton", for: .normal)
    btn.frame = CGRect(x:0, y:5, width: 80, height:40)
    //btn.addTarget(self, action: "buttonPressed:", for: UIControlEvents.touchUpInside)
    btn.tag = indexPath.row
    cell.contentView.addSubview(btn)
    cell.contentView.addSubview(label)

    cell.tag = indexPath.row

    return cell

【讨论】:

这不是一个好的解决方案。自定义单元格是一种更好的方法。 @maddy,我知道,这只是学习更多关于 swift 的练习的一部分。这就是我在“不要专注于方法”中写的原因,但是,是的,你说得对! custom cell 是更好的方法【参考方案3】:

UITableview 在向下滚动时创建 10 个单元格重新创建单元格视图

您可以使用 cell.contentView.removeFromSuperview()cell.contentView.addSubview(label) 之前或使用cell.textLabel?.text

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

        let cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier)!
        cell.contentView.removeFromSuperview()
        let label = UILabel(frame: CGRect(x: 100, y: 14, width: 400, height: 30))
        label.text = "\(data[indexPath.row])"
        label.tag = indexPath.row
        cell.contentView.addSubview(label)

        return cell
    

注意此解决方案将删除单元格中的所有子视图

【讨论】:

这段代码有一个严重的错误。此代码实际上删除了单元格的contentView。不要那样做。这真的很糟糕。您只想删除添加到 contentView 的标签。 @rmaddy 是的,他已经得到了这个,但他只是想确保这项工作的质量,自定义单元格是更好的方法 我不明白你的评论。您发布了具有严重错误的代码。它需要修复。 这只是学习更多关于 swift 的练习的一部分。所以他想问的用户 发布有致命缺陷的代码如何帮助任何人学习?请记住,随着时间的推移,您的答案将被其他人复制和粘贴。您只需要修复一行代码。以正确的方式为您的答案感到自豪。

以上是关于向单元格动态添加视图会在表格中产生问题的主要内容,如果未能解决你的问题,请参考以下文章

如何向 UICollectionView 动态添加新单元格?

向动态视图单元格添加另一个字幕

无法添加一致的高度和填充。动态表格视图单元格之间

在 UILabel 上调用 sizeToFit() 并不总是在自定义表格视图单元格中产生正确的结果

iOS动态地将新单元格加载到表格视图的底部

如何为具有动态高度的表格单元格添加底部阴影?