我有3个ViewControllers A B C. A和B ViewControllers使用C来获取数据。 A和B都有一个选择按钮,因此如果用户在A ViewController上并按下选择,则对C执行segue,用户选择存储在按下的字典中的数据,并执行segue以返回A并且字典被发回使用准备segue。如果用户在B ViewController上,则完全相同。
问题 如何让C知道哪个ViewController将字典发送回去。 是他的一种方式,我可以使用dismiss将字典发送回用户来自的ViewController或者更好的方式。
来自C ViewContrller的代码
@IBAction func doneBtnPressed(_ sender: Any) {
performSegue(withIdentifier: "backToAddMeetingVC", sender: self)
//Cant work cuz cant perform 2 segues at once
performSegue(withIdentifier: "backToProjectVC", sender: <#T##Any?#>)
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "backToAddMeetingVC" {
let destination = segue.destination as! AddMeetingVC
destination.selectedMembers = self.selectedMembers
}
if segue.identifier == "backToProjectVC" {
let destination = segue.destination as! ProjectsVC
destination.selectedMembers = self.selectedMembers
}
}
答案 0 :(得分:2)
在C controller create
中var dismissClosure: ((neededData) -> Void)?
在提交C的控制器中,其控制器(B)在prepareSegue中需要声明:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
let controller = segue.destination as! C
controller.dismissClosure = { [weak self] neededData in
guard let `self` = self else { return }
//TODO YOUR CHANGES
}
}
当您解除或弹出控制器时,在C控制器中调用此块
驳回:
dismiss(true) {
dismissClosure?(neededData)
}
弹出
dismissClosure?(neededData)
navigationController?.popViewController(animated: true)
答案 1 :(得分:0)
如果您未使用doneBtnPressed
navigationController
self.dismiss(animated: true, completion: nil)
OR
如果您使用navigationController
self.navigationController?.popViewController(animated: true)
准备segue看起来很好
答案 2 :(得分:0)
您可以使用全局变量名称mySelectedViewController
,并在执行按钮操作时设置其值,例如从ViewController A
设置mySelectedViewController = viewA
然后在C ViewController
中点击检查mySelectedViewController
值并按照它工作。