【问题标题】:How to pass data from a 2nd VC to a VC inside a container in 1st VC in swift如何快速将数据从第二个 VC 传递到第一个 VC 中容器内的 VC
【发布时间】:2019-09-13 08:48:15
【问题描述】:

我从提供的 VC 导航到 VC(让调用是 VC A)。在 VC A 中,我有一个容器视图,它有一个 VC(让我们调用 VC B)。从 VC B 我提出了另一个 VC(让我们称之为 VC C)。我需要从 VC C 将一些数据传回 VC B。我怎样才能做到这一点。

我尝试使用协议,但协议没有击中我的 VC B。它只击中 VC A。但由于我从 VC B 呈现 VC C,我无法从 VC A 将委托连接到自身。所以它不起作用。

再次尝试将数据保存为全局变量。我尝试将值设置为 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)

【问题讨论】:

  • 在这种情况下,VC B 是 self,VC C 是 remitLauncher?
  • @AlanS,No..No need to check else case.. 我更新了代码。VC C 是另一个来自 VC B 的 Presented VC。

标签: ios swift viewcontroller uicontainerview


【解决方案1】:

使用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 A中添加VC B。容器实际上在VC A中。但是呈现的VC C来自VC B,它是在VC A中的容器中添加的。
  • 是的。它也会为此工作。您只需要使用闭包将它们连接起来。
【解决方案2】:

当我尝试根据一个标志为两个视图控制器使用容器视图时,我曾经遇到过这个问题。我想出的解决方案是使用代表。我建议您创建一个由 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 的通知,通过通知的用户信息传递您需要的任何内容。如果您选择这样做,请记住在完成后从 VC_B 中删除通知观察者以避免泄漏。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-07
    • 2020-03-15
    • 1970-01-01
    • 2019-08-26
    • 2013-07-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多