通过后退按钮将变量传递给其他视图控制器

问题描述 投票:-1回答:2

我有两个视图控制器。一个导航到“show”segue。 UINavigationBar中有一个我没有改变的后退按钮。后退按钮返回初始视图控制器。在带有后退按钮的视图控制器中,我将数据存储在变量中。

如何将此数据传递给初始视图控制器?

我试过了:

viewWillDisappear(_ animated: Bool) {
    let vc = ViewController()
    vc.data = items
}

但打印时初始视图控制器中的数据为空。

我试图使用:

prepare(for segue: ...)

但我不确定后退按钮使用什么segue。

我似乎无法将后退按钮的操作添加到我的视图控制器。

swift variables segue viewcontroller
2个回答
0
投票

你可以使用一个代表。首先,创建一个协议:

protocol getItemsDelegate {
    func getItems(_ items: [String])
}

在您的第一个视图控制器类定义中添加getItems Delegate:

class myFirstViewController: UIViewController,getItemsDelegate

将其添加到第一个视图控制器中的prepare方法:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    let vc = segue.destination as! mySecondViewController
    vc.delegate = self
}

最后,在您的第一个视图控制器中,添加以下内容:

func getItems(_ items: [String]) {
    // Do something with items
}

在第二个视图控制器中,声明以下属性:

var delegate: getItemsDelegate?

然后:

override func viewWillDisappear(_ animated: Bool) {
   delegate?.getItems(items)
}

这只是另一种方法。


1
投票

vc与你要回到的控制器不是同一个控制器。


在第二个控制器中创建闭包变量,并将模型数组作为参数

class SecondViewController: UIViewController {
    var callback: (([Item]) -> Void)?
}

然后在第一个控制器的prepare(for:sender:)分配目​​的地的callback并声明你想要在调用data时改变第一个控制器的callback

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "yourSegueIdentifier" {
        let destinationVC = segue.destination as! SecondViewController
        destinationVC.callback = { items in
            self.data = items
        }
    }
}

然后当你需要(在第二个控制器的viewWillDisappear中的意思)用给定的项目调用callback

override func viewWillDisappear(_ animated: Bool) {
    callback?(items)
}
© www.soinside.com 2019 - 2024. All rights reserved.