2016-03-02 83 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都是通用的,所以它不会改变它。但是,如果你改变它,那也没问题 –

相关问题