UITableView:从TableViewController中分离数据源并分配#selector

时间:2017-03-04 00:22:52

标签: ios swift xcode uitableview ios10

我有以下设置:

UITableViewController的子类名为: MainTVC

一个名为 MainDS 的数据源文件,它是 MainTVC

的数据源

一个名为 MainCell

的单元格类

MainCell 有一个名为buttonMain

的UIButton

buttonMain将在 target (数据源文件)中的cellForRowAtIndexPath分配MainDS

来自 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需要MainDS使用的**MainTVC**实例。

我理解数据源不应该有ViewController的实例,因此不应该传入 - datasource只能访问tableView ViewController }。

问题:处理此问题的最佳做法是什么?我应该如何分配位于#selector TableViewController中的cellForRowAtIndexPath我的数据源文件中的RewriteRule ^(.*)$ index.php?xparam=$1 [QSA,L]

1 个答案:

答案 0 :(得分:0)

在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中分配MainDS

self.tableView.dataSource = MainDS(mainTVC: self)