Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/113.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios UITableView:将数据源与TableViewController分离并分配#选择器_Ios_Swift_Xcode_Uitableview_Ios10 - Fatal编程技术网

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数据源不应该知道其控制器。数据源不应该知道其控制器。