gpt4 book ai didi

swift - 如何在 UITableViewCell 类中使用 tableView 属性

转载 作者:行者123 更新时间:2023-11-28 05:57:34 25 4
gpt4 key购买 nike

在我的 swift 项目中,我有一个带有 TableViewController 类的 tableViewController 和一个带有 TableViewCell 类的原型(prototype)单元格。现在我想使用:tableViewCell 类中的 tableView.reloadData() 或其他函数。我在原型(prototype)单元格中放了一个按钮,这里是代码:

class TableViewCell: UITableViewCell {

let tableViewController = TableViewController()

@IBAction func actionButton(_ sender: UIButton) {

tableViewController.tableView.reloadData() // or other function

}
}

通过这种方法,结果是:在展开可选值时意外发现 nil。我检查了 TableViewController 类比 TableViewCell 类先加载,所以我没有发现问题。你能帮我看看这个错误是怎么发生的吗?

最佳答案

您的 actionButton 方法每次被调用时都会创建一个新的 TableViewController 实例。它不引用(大概)呈现单元格的 TableViewController

您可以通过几种方式处理这个问题。 delegate 协议(protocol)是执行此操作的“经典”方式,或者您可以使用 Swift 闭包。

委托(delegate)方法

在你的手机里

protocol TableViewCellDelegate: class {
func tableViewCellDidTapButton(_ tableViewCell: TableViewCell)
}

class TableViewCell: UITableViewCell {

var weak delegate: TableViewCellDelegate?

@IBAction func actionButton(_ sender: UIButton) {
delegate?.tableViewCellDidTapButton(self)
}
}

在你的 View Controller 中

class TableViewController: UITableViewController {

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = dequeueReusableCell(withIdentifier: "TableViewCell", for: indexPath) as! TableViewCell
cell.delegate = self
return cell
}
}

extension class TableViewController: TableViewCellDelegate {
func tableViewCellDidTapButton(_ tableViewCell: TableViewCell) {
let indexPath = indexPath(for: tableViewCell)
// do something
}
}

关闭方法

在你的手机里

class TableViewCell: UITableViewCell {

var didTapButton: Void -> () = { }

@IBAction func actionButton(_ sender: UIButton) {
didTapButton()
}
}

在你的 View Controller 中

class TableViewController: UITableViewController {

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = dequeueReusableCell(withIdentifier: "TableViewCell", for: indexPath) as! TableViewCell
cell.didTapButton = {
// do something with this indexPath
}
return cell
}
}

关于swift - 如何在 UITableViewCell 类中使用 tableView 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51013371/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com