如何从自定义UITableview单元获取tableView实例?

时间:2019-01-30 18:49:27

标签: ios swift uitableview

我有一个带有自定义UITableViewCell的tableView,在该单元格类中,我想访问保存它的tableView。为此,我使用的是cell.superView,它返回nil。但是当我不使用任何自定义UITableViewCell时,同样可以正常工作。

这是我的代码,

 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "Cell") as? TestTableViewCell
    cell?.textLabel?.text = "Test"
    return cell!
}

class TestTableViewCell: UITableViewCell {

override func awakeFromNib() {
    super.awakeFromNib()
}

func loadDetails() {
    let tableView = self.superview //which is returning nil here
}}

2 个答案:

答案 0 :(得分:0)

UITableViewDelegate上,点击一个单元格时,您可以知道哪个UITableView持有它。

触发的方法是:

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

    // tableView is the UITableView holding the cell.

}

答案 1 :(得分:0)

正如其他人在评论中告诉您的那样,单元格可以访问tableView的属性并不是一个好主意,因为该单元格依赖于表。这意味着,如果您向单元格授予权力以能够更改tableView中的属性,则两者都是依赖的,并且数百个更改表中属性的单元格可能会很混乱。因此,重新考虑设计(即面向协议的编程)是一个好主意。

但是,如果没有其他可行的方法,则可以添加一个private weak var(我们需要 private 以确保只有该单元格可以访问它,而因为我们不需要保留周期):

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "Cell") as! TestTableViewCell
    cell.tableView = tableView
    cell.textLabel?.text = "Test"
    return cell
}

class TestTableViewCell: UITableViewCell {

    private weak var tableView: UITableView?

    override func awakeFromNib() {
        super.awakeFromNib()
    }

    func loadDetails() {
        guard let tableView = tableView else { return }
        // Here you can access your tableView
    }
}