从UITableViewCell的contentView中删除子视图(重置UITableView)

时间:2010-09-21 10:42:34

标签: iphone uitableview

有关如何重置UITableView的任何想法?

我想在按下按钮时显示一组新数据,并从单元格的contentView中删除所有子视图,并使用一组新的子视图刷新它们。我尝试了[tableView reloadData],但数据确实已刷新,但添加到单元格的contentView的子视图以前仍然存在。

9 个答案:

答案 0 :(得分:37)

更好的是,当你创建单元格时:

#define MY_CUSTOM_TAG 1234
mySubview.tag = MY_CUSTOM_TAG;
[cell.contentView addSubview:mySubview] ;

稍后,当您需要删除它时:

[[cell.contentView viewWithTag:MY_CUSTOM_TAG]removeFromSuperview] ;

答案 1 :(得分:25)

我得到了答案:)

if ([cell.contentView subviews]) {
    for (UIView *subview in [cell.contentView subviews]) {
        [subview removeFromSuperview];
    }
}

这段代码将检查单元格的内容视图是否有任何子视图 如果有的话,它会在for循环迭代时删除它们!

答案 2 :(得分:16)

您可以简单地执行此操作,而不是遍历所有子视图(您自己)以删除它们,

[[scrollView subviews] makeObjectsPerformSelector:@selector(removeFromSuperview)];

答案 3 :(得分:2)

如果要删除UITableViewCell的所有子视图,可以使用以下代码:

NSArray* subviews = [cell.contentView subviews];
for (UIView* subview in subviews) {
    [subview removeFromSuperview];
}

使用@leftspin的代码

答案 4 :(得分:2)

我知道这个问题很老,但我发现解决方案有问题,如果从一个原型单元中删除一个子视图,这个视图将从所有重用的单元格中删除,这将在下一个单元格中创建一个空指针将被重复使用。

如果您继承UITableViewCell并从那里删除子视图,则必须先进行此验证:

if (mySubView != nil ) {
        mySubView.removeFromSuperview()
    }

这也适用于indexPath方法

中的cellForRow
  func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! MyCustomCell

    if (cell.mySubView != nil) {
       cell.mySubView.removeFromSuperview()
     }
    return cell
}

惠特这个你避免空指针,代码是swift 3.希望这有助于某人。 :)

答案 5 :(得分:2)

对于Swift 3.1

        let theSubviews: Array = (cell?.contentView.subviews)!
        for view in theSubviews
        {
            view.removeFromSuperview()
        }

答案 6 :(得分:0)

cell.contentView.subviews.forEach({$ 0.removeFromSuperview()})

答案 7 :(得分:0)

for subview in cell.contentView.subviews {
    subview.removeFromSuperview()
}

答案 8 :(得分:0)

您尝试替换内容而不是UI,例如将标签替换为文本:

class CustomCell : UITableViewCell     {

    var firstColumnLabel = UILabel()

    override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
        super.init(style: style, reuseIdentifier: reuseIdentifier)
        firstColumnLabel = //create label

        contentView.addSubview(firstColumnLabel)
    }

    func setData(cad: String) {
        firstColumnLabel.text = cad
    }
}

和您的tableSource

 public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        var cell : UITableViewCell?
        cell = tableView.dequeueReusableCell(withIdentifier: "CustomCell", for: indexPath) as! CustomCell
            (cell as! CustomCell).setData(cad: "new value")
        return  cell!
    }