Swift,如何告诉控制器另一个控制器是它的委托

时间:2015-09-02 08:14:42

标签: ios swift delegates

我正在学习斯威夫特,而我正在研究代表团模式。 我想我完全理解什么是授权以及它是如何工作的,但我有一个问题。

我遇到控制器A是控制器B的委托的情况。

在控制器B中,我定义了一个委托协议。 在控制器B中,我设置了一个变量委托(可选) 在控制器B中,当代理发生某些事情时,我会发送消息 控制器A必须采用我的协议方法成为代表

我无法理解每个委托控制器(在这种情况下为A)是否监听控制器B发送的消息,或者如果我必须告诉控制器B A现在是他的委托。

我注意到有人使用此代码(在控制器A中)

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
 if segue.identifier == "Example" {
 let navigationController = segue.destinationViewController as UINavigationController
 let controller = navigationController.topViewController as AddItemViewController
controller.delegate = self
 }
}

这是告诉代表谁是他的代表的唯一方法吗?

3 个答案:

答案 0 :(得分:0)

我相信,你需要告诉一个deligator谁是它的代表创建它。现在,可以以编程方式或通过故事板创建委派者。因此,基于您有两个选项,您可以通过编程方式或IB中的方式,以编程方式告诉它谁是其委托人。

这里的关键在于创造。让我解释一下自己。以UIView为例。比如,你想要一个Custom UIView对象(CustomView)。因此,您将UIView拖放到View Controller中并在身份检查器中,将其类分配给CustomView的类。因此,基本上,只要创建控制器,您的自定义视图也将被创建。现在,您可以说创建它的View Controller是其委托,或者您可以转到IB并将视图的委托连接到View Controller。

现在,让我们假设您希望以编程方式在ViewController中创建自定义视图。在这种情况下,您可能会调用 - initWithFrame:方法来创建视图,并在创建时告诉委托人谁是其委托人 -

myCustomView.delegate = self; 

与View Controller相同。

 controller.delegate = self;

因此,基本上要告诉作为其委托的委托人,首先需要创建委托人。至少,这就是我的想法。

答案 1 :(得分:0)

我认为代表团最好的例子之一是UITableView

每当您想要控制tableView的各种属性时,例如rowHeight等,您将控制器设置为tableview的delegate。要设置tableView的delegate,您需要创建tableView,这显然是由@natasha指出的。

因此,在您的情况下,您可以在创建委托人时设置委托人的委托,或者当您发现需要将委托人委托给委托人时,但您肯定需要让委托人出席以设置其属性。

您可以在需要控制时随时将控制器设置为delegate

答案 2 :(得分:0)

我确定您希望UIViewController按照描述的方式行事,但这里有一个更简单的示例,如何将委托模式与自定义类一起使用:

protocol ControllerBDelegate: class {

    func somethingHappendInControllerB(value: String) 
    /* not optional here and passes a value from B to A*/ 
    /* forces you to implement the function */
}

class ControllerB {

    var delegate: ControllerBDelegate?

    private func someFunctionThatDoSomethingWhenThisControllerIsAlive() {

        /* did some magic here and now I want to tell it to my delegate */
        self.delegate?.somethingHappendInControllerB(value: "hey there, I'm a magician")
    }

    func doSomething() {

        /* do something here */
        self.someFunctionThatDoSomethingWhenThisControllerIsAlive() 
        /* call the function so the magic can really happen in this example */
    }
}

class ControllerA: ControllerBDelegate {

    let controllerB = ControllerB()

    init() {

        self.controllerB.delegate = self /* lets say we add here our delegate*/
        self.controllerB.doSomething() /* tell your controller B to do something */
    }

    func somethingHappendInControllerB(value: String) {

        print(value) /* should print "hey there, I'm a magician" */
    }
}

我从脑海中编写代码并没有对其进行测试,但您应该了解如何使用这种模式。