在Swift中传递数据

use*_*253 14 model-view-controller swift xcode6 ios8

我一直在寻找答案,但只找到了segues的答案.

我有viewController1一个可以按下的按钮viewController2.没有代码,我通过Interface builder进行设置.在viewController2我有一个按钮,驳回本身

 self.dismissViewControllerAnimated(true, completion, nil)
Run Code Online (Sandbox Code Playgroud)

我想从viewController2后面传递一个字符串到viewController1视图被解除时.我该怎么做呢?另外,我正在使用swift.

提前致谢!

dre*_*wag 42

有两种常见的模式,这两种模式都不需要viewController2明确地了解viewController1(这对于可维护性非常有用):

  1. 为viewController2创建委托协议,并将viewController1设置为委托.每当您想要将数据发送回viewController1时,请让viewController2发送"委托"数据

  2. 将闭包设置为允许传递数据的属性.viewController1在显示viewController2时会在viewController2上实现该闭包.每当viewController2有要传回的数据时,它就会调用闭包.我觉得这种方法比较"快捷".

以下是#2的一些示例代码:

class ViewController2 : UIViewController {
    var onDataAvailable : ((data: String) -> ())?

    func sendData(data: String) {
        // Whenever you want to send data back to viewController1, check
        // if the closure is implemented and then call it if it is
        self.onDataAvailable?(data: data)
    }
}

class ViewController1 : UIViewController {
   func doSomethingWithData(data: String) {
        // Do something with data
    }
    override func prepareForSegue(segue: UIStoryboardSegue!, sender: AnyObject!) {
        // When preparing for the segue, have viewController1 provide a closure for
        // onDataAvailable
        if let viewController = segue.destinationViewController as? ViewController2 {
            viewController.onDataAvailable = {[weak self]
                (data) in
                if let weakSelf = self {
                    weakSelf.doSomethingWithData(data)
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)