2017-03-04 68 views
1

我有以下設置:的UITableView:從TableViewController分離數據源和分配#selector

UITableViewController子類,稱爲:MainTVC

稱爲一個數據源文件:MainDS這是一個數據源,以MainTVC

一個單元類稱爲:MainCell

MainCell有一個名爲的UIButton:

.... 

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

buttonMain將在cellForRowAtIndexPathMainDS(數據源文件)

MainDS代碼分配

buttonMain被點擊時沒有任何反應,因爲cell.buttonMain.addTarget(MainTVC() .. < - #selector需要MainDS使用的**MainTVC**的實例。

這是我的理解是一個數據源不應該有它的ViewController的一個實例,因此,它不應該被傳入 - 數據源只是訪問其ViewControllertableView

問題:處理這個問題的最佳做法是什麼?我應該如何分配#selector位於TableViewControllercellForRowAtIndexPath這是我的數據源文件的一部分?

+0

不要調用通過#selector的方法;使用委託或關閉 – Paulw11

回答

0

在你MainDS,創建參數初始化函數是一個MainTVC e.g:在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 
    } 
.... 
} 

頁頭MainDS

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

數據源不應該知道其控制器。 – user1107173