通过后退按钮将变量传递给其他视图控制器
Pass variable to other view controller via back button
我有两个视图控制器。一个是使用 "show" segue 导航到的。 UINavigationBar 中有一个我没有更改的后退按钮。后退按钮返回到初始视图控制器。在带有后退按钮的视图控制器中,我将数据存储在一个变量中。
如何将此数据传递给我的初始视图控制器?
我试过:
viewWillDisappear(_ animated: Bool) {
let vc = ViewController()
vc.data = items
}
但打印时初始视图控制器中的数据为空。
我尝试使用:
prepare(for segue: ...)
但我不确定后退按钮使用什么 segue。
我似乎也无法将后退按钮的操作添加到我的视图控制器。
vc
与您要返回的控制器不是同一个控制器。
在第二个控制器中使用模型数组作为参数创建闭包变量
class SecondViewController: UIViewController {
var callback: (([Item]) -> Void)?
}
然后在第一个控制器的 prepare(for:sender:)
中分配目的地 callback
并声明当 callback
被调用时您想要更改第一个控制器的 data
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)
}
您可以使用委托。首先,创建一个协议:
protocol getItemsDelegate {
func getItems(_ items: [String])
}
在您的第一个视图控制器的 class 定义中添加 getItemsDelegate:
class myFirstViewController: UIViewController,getItemsDelegate
将此添加到您的第一个视图控制器中的准备方法:
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)
}
这只是另一种方法。
我有两个视图控制器。一个是使用 "show" segue 导航到的。 UINavigationBar 中有一个我没有更改的后退按钮。后退按钮返回到初始视图控制器。在带有后退按钮的视图控制器中,我将数据存储在一个变量中。
如何将此数据传递给我的初始视图控制器?
我试过:
viewWillDisappear(_ animated: Bool) {
let vc = ViewController()
vc.data = items
}
但打印时初始视图控制器中的数据为空。
我尝试使用:
prepare(for segue: ...)
但我不确定后退按钮使用什么 segue。
我似乎也无法将后退按钮的操作添加到我的视图控制器。
vc
与您要返回的控制器不是同一个控制器。
在第二个控制器中使用模型数组作为参数创建闭包变量
class SecondViewController: UIViewController {
var callback: (([Item]) -> Void)?
}
然后在第一个控制器的 prepare(for:sender:)
中分配目的地 callback
并声明当 callback
被调用时您想要更改第一个控制器的 data
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)
}
您可以使用委托。首先,创建一个协议:
protocol getItemsDelegate {
func getItems(_ items: [String])
}
在您的第一个视图控制器的 class 定义中添加 getItemsDelegate:
class myFirstViewController: UIViewController,getItemsDelegate
将此添加到您的第一个视图控制器中的准备方法:
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)
}
这只是另一种方法。