[英]How to pass data from a 2nd VC to a VC inside a container in 1st VC in swift
我从显示的VC导航到VC(让我们称之为VC A)。 在VC A中,我有一个容器视图,并且有一个VC(让我们称之为VC B)。 从VC BI提出了另一个VC(让我们称之为VC C)。 从VC CI需要将一些数据传递回VCB。如何实现相同的目的。
我尝试使用协议,但协议没有达到我的VC B,仅达到了VC A. 但是由于我是从VC B中呈现VC C,所以无法将委托从VC A连接到self。因此它不起作用。
再次尝试将数据保存为全局变量。 我试图将值设置为VC B中的viewWillAppear和ViewDidAppear中的字段。但是由于某种原因,它每次都崩溃。 坠机事故越来越严重
containerView.addSubview(remitController.view).
let remitController = remitStoryboard.instantiateViewController(withIdentifier: "AddBeneficiaryController") as! AddBeneficiaryController
addChildViewController(remitController)
remitController.view.translatesAutoresizingMaskIntoConstraints = false
containerView.addSubview(remitController.view)
NSLayoutConstraint.activate([
remitController.view.leadingAnchor.constraint(equalTo: containerView.leadingAnchor),
remitController.view.trailingAnchor.constraint(equalTo: containerView.trailingAnchor),
remitController.view.topAnchor.constraint(equalTo: containerView.topAnchor),
remitController.view.bottomAnchor.constraint(equalTo: containerView.bottomAnchor)
])
remitController.didMove(toParentViewController: self)
使用closure
来解决问题陈述。
在VCC
控制器中创建一个closure
,
class VCC: UIViewController {
var handler: ((String)->())?
func passDataToVCB() {
handler?("This is sample data.")
}
}
每当您要将数据与相关数据一起传递回VCB
时,都调用handler
。 我在这里使用String
。
接下来,在VCB
当您呈现VCC
实例时,设置handler
值,
if let vcc = self.storyboard?.instantiateViewController(withIdentifier: "VCC") as? VCC {
vcc.handler = {(value) in
print(value)
}
//present vcc here...
self.present(vcc, animated: true, completion: nil)
}
当我尝试根据标志使用两个视图控制器的容器视图时,曾遇到此问题。 我想出的解决方案是使用委托。 我建议您创建一个由VC B实现的委托。在VC C实例化时,您要设置该委托。 在VC C中应将其声明为弱,以避免保留周期和内存泄漏。 呼叫代表,并将您的数据从VC C发回B
protocol CtoBDelegate : class{
func sendMyDataBack()//pass in any arguments also
}
class VC_C : UIViewController{
weak var delegate : CtoBDelegate?
override func viewDidLoad(){
//do something
delegate?.sendMyDataBack
}
}
class VC_B : UIViewController{
override func viewDidLoad(){
let vc_C = //instantiate your view controller
vc_C.delegate = self
present(vc_C, animated : true)
}
}
extension class VC_B : CtoBDelegate{
func sendMyDataBack(){
//do something with received data in VC_B
}
}
可以实现通信的另一种粗略方法是使用NotificationsCenter。 只需在VC_B中注册您的通知,并设置一种在收到通知时调用的方法。 然后发布来自VC_C的通知,将所需信息与通知的userinfo一起传递。 如果选择此选项,请务必在完成操作后从VC_B中删除通知观察器,以免发生泄漏。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.