2016-03-02 63 views
1

我讀了很多關於代表,但實際上我不能正確使用它。如何在Swift中正確使用委託?

描述:我有A: UIViewController,B: UIView,C: UIViewController。我想從A: UIViewController到從B: UIView內部的C: UIViewController繼續運行。

我已經試過:

protocol SegueDelegate { 
    func runSegue(identifier: String) 
} 

class B: UIView { ... } 

凡在我A: UIViewController

override func viewDidLoad() { 
    B().delegate = self 
} 

func runSegue(identifier: String) { 
    self.performSegueWithIdentifier(identifier, sender: self) 
} 

,並試圖通過調用它:

@IBAction func send(sender: AnyObject) { 
    let a: SegueDelegate? = nil 
    a!.runSegue("goToMainPage") 
} 

,但我敢肯定,我做沒有正確使用它。任何人都可以幫助我嗎?我不想要一個答案。請描述我來說,概念不久

回答

1

代表只是一個設計模式,您可以通過多種方式使用。您可以查看Apple框架以查看如何以及在何處使用代表作爲示例。表視圖委託可能是UIKit中最知名的委託。

代理充當代碼的回調機制,以便與未知類的實例進行通信,而不必知道該實例將響應委託協議的方法。

委託的替代方法是使用閉包(我們曾經稱之爲Objective-C中的塊)。什麼時候使用其中一個就是品味的問題。有幾條經驗法則,例如outlined here

你在做什麼是IMO,使用代表的正確方法。您可以通過代理將視圖功能與View Controller的功能分開,因此您的視圖的合同很明確:用戶需要響應委託方法。

您的代碼有效且正確。我做了一個快速的實現在這裏:https://github.com/kristofvanlandschoot/DelegateUsage/tree/master

從你的榜樣的主要區別,也許這就是你犯了一個錯誤是你的代碼的第三部分,你應該寫類似的地方:

@IBAction func send(sender: AnyObject) { 
    delegate?.runSegue("segueAB") 
} 
+0

非常感謝你的例子!我只想問一下這行:'self.viewWithDelegate.delegate = self'。我無法將視圖設置爲委託'self.view.delegate'。需要我爲此做些額外的事情,或者我明白錯誤? –

+0

不知道我完全理解你的問題。 ViewControllerA需要設置viewWithDelegate的委託。 viewWithDelegate怎麼知道如何獲得委託? –

+0

你能接受答案嗎? –

0

有在你的代碼的多個錯誤,例如:

在這裏,你要創建一個新的B,並設定爲新實例的委託,沒有你真正想要的

override func viewDidLoad() { 
    «B()».delegate = self 
} 

在這裏你正在創建力展開一個零值

@IBAction func send(sender: AnyObject) { 
    let a: SegueDelegate? = «nil» 
    «a!».runSegue("goToMainPage") 
} 

如果你想要做的是告訴一個執行SEGUE到C,B的內部,所有你需要做的是調用performSegueWithIdentifier上的一個

例如:

class B: UIView { 
    weak var referenceToA: UIViewController? = nil // set this somewhere 
    @IBAction func send(sender: AnyObject) { 
     guard let a = referenceToA else { 
      fatalError("you didn't set the reference to a view controller of class A") 
     } 
     a.performSegueWithIdentifier("goToMainPage", sender: self) 
    } 
} 
+0

需要我改變'弱var referenceToA:UIViewController? = nil'到我自己的ViewController類或我需要保存'UIViewController'? –

+0

與你的代碼我得到下一個錯誤'致命的錯誤:你沒有設置變量的參考:'on line'fatalError(「你沒有設置變量的引用」) –

+0

沒關係,你自己的類是UIViewController的一個子類,你想要使用的方法對所有UIViewControllers都是通用的,所以它不會改變它。但是,如果你改變它,那也沒問題 –