[英]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.