从UitableViewCell中删除所有子图层

时间:2018-02-06 11:40:38

标签: swift uitableview layer

我有UITableView,有2个扩展的部分。 因此,当我点击部分标题时,行将被隐藏:

override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {

    print("Section: \(indexPath.section), Row \(indexPath.row), \(sections[indexPath.section].expanded)")

    if sections[indexPath.section].expanded {
        return 88
    } else {
        return 0
    }
}

我正在向UITableView中的单元格添加UIlabel,如下所示:

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

    let cell = tableView.dequeueReusableCell(withIdentifier: cellId, for: indexPath)

    let label = UILabel()
    cell.contentView.addSubview(label)
    label.translatesAutoresizingMaskIntoConstraints = false

    label.leftAnchor.constraint(equalTo: cell.leftAnchor).isActive = true
    label.topAnchor.constraint(equalTo: cell.topAnchor).isActive = true
    label.widthAnchor.constraint(equalTo: cell.widthAnchor).isActive = true
    label.heightAnchor.constraint(equalToConstant: 30).isActive = true

    label.text = "row = \(indexPath.row)"

    return cell
}

上面的工作正常,但是单元格没有正确显示屏幕,row1的内容会打印在另一行。

如果我添加以下代码,当我点击任何部分的标题时,行将在tableView上正确显示,但只是一次,我的意思是如果我再次单击标题,则出现错误发生在CellForRowAt函数内部(线程1:EXC_BAD_ACCESS(代码= EXC_I386_GPFLT)):

cell.contentView.layer.sublayers?.forEach { $0.removeFromSuperlayer() }

有任何建议吗?

编辑: 为了解释这些部分是如何扩展的,我将添加以下内容:

protocol ExpandableHeaderViewDelegate {
    func toggleSection(header: ExpandableHeaderView, section: Int)
}

class ExpandableHeaderView: UITableViewHeaderFooterView {

    var delegate: ExpandableHeaderViewDelegate?
    var section: Int!

    override init(reuseIdentifier: String?) {
        super.init(reuseIdentifier: reuseIdentifier)

        self.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(selectHeaderAction)))
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    @objc func selectHeaderAction(gestureRecognizer: UITapGestureRecognizer) {
        let cell = gestureRecognizer.view as! ExpandableHeaderView
        delegate?.toggleSection(header: self, section: cell.section)
    }

    func toggleSection(header: ExpandableHeaderView, section: Int) {
        tableView.beginUpdates()
        tableView.endUpdates()
    }

}

4 个答案:

答案 0 :(得分:0)

如果问题仅在于细胞数据不匹配,请尝试使用

override func prepareForReuse() {
    super.prepareForReuse()
    self.label.text = ""
}

使用null值在单元格的类中声明UILabel,而不是在cellForRowAt

中声明它

答案 1 :(得分:0)

在cellForRowAt中尝试:

if tableView.rectForRow(at: indexPath).height == 0.0 {
            return UITableViewCell()
}

它应该高于所有其他代码。

答案 2 :(得分:0)

尝试(在添加新标签之前调用它)

cell.contentView.subviews.removeAll() 

而不是

cell.contentView.layer.sublayers?.forEach { $0.removeFromSuperlayer() } 

答案 3 :(得分:0)

我的问题由[Knight0fDragon]解决。

0

然后

$location = array();
$name     = array();

foreach( $entities->results as $key => $value ) {

    if( stristr($value->vicinity, $key_stroke) ) {

        $location[] = array(
           'place_id' => $value->place_id,
           'vicinity' => $value->vicinity,
        );
    }

    if( stristr($value->name, $key_stroke) ) {

        $name[] = array(
            'place_id' => $value->place_id,
            'name'     => $value->name,
        );
    }
}

感谢所有善良的人们的支持。