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

标签 ios swift xcode uitableview ios10

我有以下设置:

UITableViewController 的子类调用:MainTVC

名为 MainDS 的数据源文件是 MainTVC

的数据源

一个单元类称为:MainCell

MainCell 有一个名为:buttonMain

的 UIButton

buttonMain 将在 MainDScellForRowAtIndexPath 中分配一个 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/

相关文章:

ios - TableView圆角和阴影

ios - Swift webview xcode 发布数据

ios - UISplitViewController - 详细 View 尺寸错误

ios - Swift:class does not implement methodSignatureForSelector: -- 前面有麻烦无法识别的选择器

iphone - 在iPhone SDK中的YouTube播放器中播放视频

Swift image Aspect Fill 高图像不起作用

ios - SwiftUI ForEach View 第一次未更新

ios - 使用标签在 TableView 中检索数据的问题

ios - 委托(delegate)通过父 View Controller 和嵌入式 View Controller 捕获了什么?

xcode - 什么是 StoryBoard ID,我该如何使用它?