我有以下设置:
UITableViewController
的子类调用:MainTVC
名为 MainDS
的数据源文件是 MainTVC
一个单元类称为:MainCell
MainCell
有一个名为:buttonMain
buttonMain
将在 MainDS
的 cellForRowAtIndexPath
中分配一个 target
(数据源文件)
来自 MainDS
的代码:
....
func tableView(_ tableView: UITableView,
cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "MainCell", for: indexPath) as! MainCell
cell.buttonMain.addTarget(MainTVC(), action: #selector(MainTVC.buttonMainTapped(sender:)), for: .touchUpInside)
return cell
}
....
当 buttonMain
被点击时没有任何反应,因为 cell.buttonMain.addTarget(MainTVC()
.. <- #selector
需要实例**MainTVC**
由 MainDS 使用。
据我了解,数据源不应该有其 ViewController
的实例,因此不应传入它——数据源只能访问 tableView
它的 ViewController
。
问题:处理此问题的最佳做法是什么?我应该如何分配位于 cellForRowAtIndexPath
中的 TableViewController
中的 #selector
,这是我的数据源文件的一部分?
最佳答案
在您的 MainDS 中,创建参数为 MainTVC 的初始化函数,例如:
class MainDS: UITableViewDataSource
{
weak var mainTVC:MainTVC?
init(mainTVC: MainTVC) {
self.mainTVC = mainTVC
}
....
func tableView(_ tableView: UITableView,
cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "MainCell", for: indexPath) as! MainCell
cell.buttonMain.addTarget(self.mainTVC?, action: #selector(MainTVC.buttonMainTapped(sender:)), for: .touchUpInside)
return cell
}
....
}
在 MainTVC 中分配 MainDS
self.tableView.dataSource = MainDS(mainTVC: self)
关于ios - UITableView:从 TableViewController 中分离数据源并分配#selector,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42590578/