繁体   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