内部heightForRowAt

时间:2017-09-15 03:09:25

标签: ios swift uitableview swift3

我正在尝试使用以下代码创建可扩展的UITableViewCells:

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    let cell = tableView.cellForRow(at: indexPath) as! feedBaseCell

    if cell.expandButton.isExpanded == true {
        return 128
    } else {
        return 64
    }
    return 64
}

.isExpanded是feedBaseCell的自定义属性。当我运行此代码时,行let cell = tableView.cellForRow(at: indexPath) as! feedBaseCell会收到EXC_BAD_ACCESS错误。如何检查.isExpanded属性并根据高度是真还是假来返回高度?为什么我的代码不起作用?

编辑:cellForRowAtnumberOfRowsInSection的代码:

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

    return 3
}

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

    cell.backgroundColor = .clear
    cell.selectionStyle = UITableViewCellSelectionStyle.none
    cell.contentView.isUserInteractionEnabled = false

    cell.expandButton.tag = indexPath.row
    cell.expandButton.addTarget(self, action: #selector(self.expandTheCell(_:)), for: .touchUpInside)
    cell.contentView.bringSubview(toFront: cell.expandButton)

    return cell
}

以下是expandTheCell方法:

func expandTheCell(_ sender: UIButton) {
    if sender.isExpanded == false {
        UIView.animate(withDuration: 0.5, delay: 0, usingSpringWithDamping: 1, initialSpringVelocity: 1, options: .curveEaseOut, animations: {
            sender.transform = sender.transform.rotated(by: .pi/2)
            sender.isExpanded = true
        }, completion: nil)
    } else {
        UIView.animate(withDuration: 0.5, delay: 0, usingSpringWithDamping: 1, initialSpringVelocity: 1, options: .curveEaseOut, animations: {
            sender.transform = sender.transform.rotated(by: -.pi/2)
            sender.isExpanded = false
        }, completion: nil)
    }
    tableView.beginUpdates()
    tableView.endUpdates()
}

1 个答案:

答案 0 :(得分:5)

切勿在{{1​​}}内致电cellForRow(at:)。它会导致无限递归,因为当您请求单元格时,表视图会尝试获取单元格的高度。

如果你真的需要一个单元来计算它的高度,直接调用你的视图控制器的dataSource方法heightForRowAt方法而不是表视图的tableView(_:cellForRowAt:)方法。

但在这种情况下你不需要细胞。您应该在数据源数据中存储每行的展开状态,而不是在单元格本身中。查看该数据,而不是单元格,以确定cellForRow(at:)方法中的高度。当然,您需要在heightForRowAt数据源方法中使用此状态信息,以便可以设置单元格的状态,因为在滚动表格视图时可以重复使用单元格。