簡體   English   中英

如何快速將數據從第二個VC傳遞到第一個VC中的容器內的VC

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM