我有一个带有自定义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
}}
答案 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
}
}