使用 dismiss 在 ViewController 之间传递数据
Pass data between ViewControllers using dismiss
我有 3 ViewControllers A B C。
A和BViewControllers使用C获取数据。 A 和 B 都有一个 select 按钮,因此如果用户在 A ViewController 上并按下 select,则会对 C 执行 segue,用户 selects 数据存储在 a字典按下完成并执行 segue 以返回到 A,并使用 prepare for segue 将字典发送回。如果用户在 B ViewController.
上则完全相同
问题
我如何让 C 知道将字典发送回哪个 ViewController。
他们是我可以使用 dismiss 将字典发送回用户来自的 ViewController 的一种方式,或者可能是更好的方式。
来自 C ViewController 的代码
@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
}
}
内部 doneBtnPressed
如果您不使用 navigationController
,请使用下面的内容
self.dismiss(animated: true, completion: nil)
或
如果您使用 navigationController
,请使用下面的行
self.navigationController?.popViewController(animated: true)
准备 segue 看起来很好
您可以使用像 mySelectedViewController
这样的全局变量名称,并在每次执行按钮操作时设置它的值,例如当您单击 from ViewController A
set mySelectedViewController = viewA
然后 in C ViewController
检查 mySelectedViewController
值并根据它工作。
在 C 控制器中创建
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)
我有 3 ViewControllers A B C。 A和BViewControllers使用C获取数据。 A 和 B 都有一个 select 按钮,因此如果用户在 A ViewController 上并按下 select,则会对 C 执行 segue,用户 selects 数据存储在 a字典按下完成并执行 segue 以返回到 A,并使用 prepare for segue 将字典发送回。如果用户在 B ViewController.
上则完全相同问题 我如何让 C 知道将字典发送回哪个 ViewController。 他们是我可以使用 dismiss 将字典发送回用户来自的 ViewController 的一种方式,或者可能是更好的方式。
来自 C ViewController 的代码
@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
}
}
内部 doneBtnPressed
如果您不使用 navigationController
self.dismiss(animated: true, completion: nil)
或
如果您使用 navigationController
self.navigationController?.popViewController(animated: true)
准备 segue 看起来很好
您可以使用像 mySelectedViewController
这样的全局变量名称,并在每次执行按钮操作时设置它的值,例如当您单击 from ViewController A
set mySelectedViewController = viewA
然后 in C ViewController
检查 mySelectedViewController
值并根据它工作。
在 C 控制器中创建
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)