一尘不染

在Swift中传递数据

swift

我一直在寻找答案,但只能找到答案。

我有viewController1一个按钮可以选择viewController2。没有代码,我通过“接口”构建器进行设置。上,viewController2我有一个按钮,可以自行关闭

 self.dismissViewControllerAnimated(true, completion, nil)

我想从视图传递viewController2viewController1时传递一个字符串。我该怎么做呢?另外,我正在使用swift。

提前致谢!


阅读 292

收藏
2020-07-07

共1个答案

一尘不染

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

  1. 为您的viewController2创建委托协议,并将viewController1设置为委托。每当您想将数据发送回viewController1时,都要使viewController2将数据“委托”

  2. 将闭包设置为允许传递数据的属性。当显示viewController2时,viewController1将在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)
                }
            }
        }
    }
}
2020-07-07