2015-10-20 57 views
1

我有一個UITableView類,我放在多個ViewControllers。從控制器觸發從UITableView segue

我想在用戶didSelectRowAtIndexPath時繼續使用另一個ViewController。

但是,因爲UITableView類是獨立的,所以我不能從類中以編程方式觸發seglog,因爲selfself.performSegueWithIdentifierself.showViewController引用了UITableView。

據我所知,它是ViewControllers應該負責segues,但我不能從給定的ViewController訪問didSelectRowAtIndexPath(因爲它不管理UITableView)。

如何從不從ViewController繼承的UITableView繼承?

回答

0

首先,我想推薦Apple的文檔Adding a Segue Between Scenes in a Storyboard

您絕對將您的UITableView放置在視圖控制器上,並在故事板上設置UITableViewDelegate,UITableViewDataSource,以便您的視圖控制器可以知道用戶選擇了哪一行。

1

您需要一種方法來告訴視圖控制器已經選擇了表格視圖上的一行,以便視圖控制器可以執行segue。

委託是啓用此通信的好方法。

  1. 定義委託協議。

    protocol TableRowSelectionDelegate: class { 
        func tableRowSelected(rowValue: String) 
    } 
    
  2. 在你的表視圖類中定義一個委託變量。

    var tableRowSelectionDelegate: TableRowSelectionDelegate? 
    
  3. 在表格視圖類,當選擇的表格行,調用該委託,傳遞行值(即,從對應於所選索引路徑模型數據)。使用可選的?操作員,這樣如果代表沒有設置,沒有什麼不好的事情發生。

    tableRowSelectionDelegate?.tableRowSelected(rowValue) 
    
  4. 將協議添加到您的視圖控制器。

    class ViewController: UIViewController, TableRowSelectionDelegate 
    
  5. 在您的視圖控制器,將其設置爲委託你的表視圖類。

    tableViewClass.tableRowSelectionDelegate = self 
    
  6. 在您的視圖控制器中實現協議。

    func tableRowSelected(rowValue: String) { 
        //perform the segue here... 
        // if necessary, pass the row value to the destination 
        // view controller before performing the segue 
    } 
    

此委託協議,現在可以通過使用你的表視圖類中的所有視圖控制器來實現,每個視圖控制器可以但它要作出迴應。也許你不會總是想要繼續。讓代表決定。

+0

難道你不覺得有一個不太好的方法來做到這一點? –

+0

根本不是一種冒險的方式。祝你好運。 –

相關問題