2016-11-01 55 views
0

我跟着this tutorial有委託方法更新其他類中的值,但它甚至沒有觸發它。你能告訴我我做錯了什麼嗎?Swift3中的協議/代理不起作用

protocol myDelegate { 
    func report(info:String) 
} 

class TypeFilterViewController: UIViewController, XLFormRowDescriptorViewController, 
           UITableViewDataSource, UITableViewDelegate { 

    var delegate:myDelegate? 

    func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 
     self.delegate?.report("testValue") 
     self.navigationController?.popViewControllerAnimated(true) 
    } 
} 

所以,當我選擇行項目後,我排除了推送視圖並顯示以前的類。

class SearchRefinementsTypeCell: XLFormBaseCell, XLFormBaseCellSeparator, myDelegate { 

    // Delegate method 
    func report(info: String) { 
     print("delegate: \(info)") 
    } 

    override func update() { 
     super.update() 
     let mc = TypeFilterViewController() 
     mc.delegate = self 

     self.headerLabel.text = //Value from TypeFilterViewController didSelectRow 
    } 

謝謝你的所有幫助。

+1

爲什麼你需要從控制器委派給單元,而不是相反?每次調用update()函數時,您都會在單元類中創建一個新的控制器對象,並且從不使用該對象,它只是在函數完成時纔會釋放。 – alexburtnik

+0

我正在使用Xlform庫,因此SearchRefinementsTypeCell是我在主不在TypeFilterViewController中查看,並且TypeFilterViewController具有hiw擁有另一個單元格。這兩個實際上並不相關。但不知何故,我需要在用戶選擇TypeFilterViewController下的單元格並觸發didSelectRow後更新此SearchRefinementsTypeCell中的標籤。我希望我能解釋它。 – Umitk

+0

@alexburtnik很好的答案我完全同意。協議應該是自定義單元類的一部分,並且視圖控制器應符合協議。你需要翻轉東西。 – user3353890

回答

2

您明顯誤解了本教程。 當您想從單元委派給視圖控制器時,委託模式很有用。你做的相反:從viewController發送事件到一個單元格,這是毫無意義的,因爲你的viewController已經可以訪問它的tableView,它在它的單元格中運行。

此外,您不應該在單元類中使用任何ViewController,因爲它會打破MVC模式。你應該想到UITableViewCell以及幾乎每個UIView那些無法自行決定任何東西的無力對象,但只能將事件委託給其他智能人員,他們自己完成邏輯(視圖控制器)。

現在你的情況: 你有vc A和vc B,推過來。當B中的一個單元格被按下時,你應該向A發送一個回叫,對嗎?你應該做的:

  1. B有它實現了一些協議,委託
  2. 當A推B,其設置的本身作爲一個協議:b.delegate = self
  3. 當選擇B細胞,可以調用委託的方法,它在A中實現並將字符串傳遞給它。
  4. A中的UI已更新。

再一次,細胞一定不知道任何關於你的任何視圖控制器,他們只是典當。所有的邏輯應該在視圖控制器之間進行處理。

+0

我已經完成了你所說的,但沒有觸發。也許這是有點特殊的情況是,使用xlform方法,但在這裏仍然應該有一種方法來使用協議。我不知道爲什麼..我會無論如何都滿意,謝謝你的幫助。 – Umitk