Делегат на языке Swift

У меня есть два контроллера, и мне нужно вызвать функцию первого контроллера для второго контроллера: во втором контроллере я создал протокол и инициализировал делегата в классе:

    protocol testProtocol {
        func testDelegate() // this function the first controllers
    }

    class SecondViewController: UIViewController {
        var delegate: testProtocol?
    ....
    }
    @IBAction func testDelegateClicked(sender : AnyObject) {
            delegate?.testDelegate()
        }

First Controller

        class ViewController: UIViewController, testProtocol {

var secondController: SecondViewController = SecondViewController() override func viewDidLoad() { super.viewDidLoad() secondController.delegate = self } func testDelegate() { println("Hello delegate") }</pre>

Но функция не вызывается


person Lola    schedule 05.06.2014    source источник
comment
Как вы показываете secondViewController?   -  person Firo    schedule 05.06.2014
comment
во втором контроллере только стандартные функции (ViewDidLoad и didReceiveMemoryWarning) и обработчик кнопки я показал   -  person Lola    schedule 05.06.2014
comment
Также убедитесь, что вы получили слабую ссылку на делегата. Свойства в Swift по умолчанию сильны   -  person Alex Zielenski    schedule 10.06.2014


Ответы (1)


Я собираюсь сделать предположение, что вы используете раскадровки. Если я прав, то ваша проблема в том, что ваш secondController, созданный в вашем Первом контроллере, не является тем, который вы представляете. Вам нужно будет установить secondController в prepareForSegue:

Второй контроллер

Без изменений

Первый контроллер

class ViewController: UIViewController, testProtocol {

    // you will want to add the ? since this variable is now optional (i.e. can be nil)
    var secondController: SecondViewController? // don't assign it a value yet

    // ...

    // implementation of the protocol
    func testDelegate() {
        println("Hello delegate")
    }

    // your prepare for segue
    override func prepareForSegue(segue: UIStoryboardSegue?, sender: AnyObject?) {
        // get the controller that storyboard has instantiated and set it's delegate
        secondController = segue!.destinationViewController as? SecondViewController
        secondController!.delegate = self;
    }
}
person Firo    schedule 05.06.2014
comment
но я использую secondController = segue!.destinationViewController as SecondViewController secondController.delegate = self; - person Lola; 05.06.2014
comment
@Мария, посмотри на мой добавленный комментарий. Вы захотите добавить ? к переменной secondController. Если вы сделаете это, вам также понадобится as? - person Firo; 05.06.2014
comment
Если мы не используем раскадровку, как реализовать @Firo - person PREMKUMAR; 05.06.2014
comment
@PREMKUMAR, вы бы просто создали свой новый контроллер представления (var controller = SecondController()), установили его делегата (controller.delegate = self), а затем, наконец, представили его (self.navigationController.pushViewController(controller))... если у вас все еще есть проблемы, дайте мне знать! - person Firo; 16.06.2014