Ios UITableView:将数据源与TableViewController分离并分配#选择器
我有以下设置:Ios UITableView:将数据源与TableViewController分离并分配#选择器,ios,swift,xcode,uitableview,ios10,Ios,Swift,Xcode,Uitableview,Ios10,我有以下设置: UITableViewController的一个子类称为:MainTVC 名为:MainDS的数据源文件是MainTVC的数据源 一个名为:MainCell MainCell有一个名为“buttonMain”的UI按钮 按钮main将在单元格中为行索引路径指定目标(数据源文件) 来自维护的代码: .... func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPa
UITableViewController
的一个子类称为:MainTVC
名为:MainDS
的数据源文件是MainTVC
的数据源
一个名为:MainCell
MainCell
有一个名为“buttonMain”的UI按钮
按钮main
将在单元格中为行索引路径指定目标(数据源文件)
来自维护的代码
:
....
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
}
....
点击按钮main
时不会发生任何事情,因为cell.buttonMain.addTarget(MainTVC()
。在MainDS中,使用参数创建init函数是一个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中的alloc MainDS
self.tableView.dataSource = MainDS(mainTVC: self)
在MainDS中,带有参数的create init函数是一个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中的alloc MainDS
self.tableView.dataSource = MainDS(mainTVC: self)
不要通过#选择器调用方法;使用委派或Closure不要通过#选择器调用方法;使用委派或Closure数据源不应该知道其控制器。数据源不应该知道其控制器。