在视图控制器和容器视图之间共享数据

Share Data Between View Controller and Container View

我有一个视图控制器,它有一个到第二个视图控制器的 segue,我将一些数据传递给第二个视图控制器以准备 segue。 问题是:第二个视图控制器有一个容器视图,我需要与之共享该数据。我尝试使用 prepare for segue 但在这种情况下它不起作用。

更新:

查看控制器代码:

class ViewController: UITableViewController, ContainerViewDelegate {

   var myContainerView = ContainerView()
   var id: String!

   override func viewDidLoad() {
        super.viewDidLoad()
        id = "123"
        myContainerView.delegate = self
   }

   func initialize() -> String {
        return id
   }
}

容器查看代码:

protocol ContainerViewDelegate {
   func initialize() -> String
}

class ContainerView: UICollectionViewController {

   var delegate: ContainerViewDelegate!
   var id: String!
   override func viewDidLoad() {
       super.viewDidLoad()
       id = delegate.initialize()
       print(id)
   }
}

我收到错误:fatal error: unexpectedly found nil while unwrapping an Optional value 在行:id = delegate.initialize()

您可以使用 prepare for segue 并将您想要的所有内容发送到第二个 Controller ...

    override func prepareForSegue(segue: UIStoryboardSegue, sender:   AnyObject?) {
    // get a reference to the second view controller
    let secondViewController = segue.destinationViewController as! SecondViewController

    // set a variable in the second view controller to pass
    secondViewController.data = data
    }

双向:

  1. 在您的第二个视图控制器中,覆盖 prepare(for:sender:)

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    
        if segue.identifier == "loadContainerView" { // replace with your segue identifier
             let childViewControllerController = segue.destination
             // pass data
        }
    }
    
  2. 在您的第二个视图控制器中,使用 childViewControllers 访问容器视图的控制器。

    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        if let childViewController = childViewControllers.first {
            // pass your data
        }
    }
    

示例项目: https://www.dropbox.com/s/he97ldzhav2non3/ContainerViewTest.zip?dl=0

您设置委托的方向正确。

在情节提要中:

  • 创建一个类型为 Embed Segue 的 Segue,从 ContainerView 到 ViewController 以嵌入。
  • Select segue 并设置一个 Identifier.

在代码中,在prepareForSegue()中:

  • 设置 myContainerView 属性
  • 设置委托

    class ViewController: UITableViewController, ContainerViewDelegate {
        var myContainerView:ContainerView? // we do initialize it in prepareForSegue()
        var id: String!
    
        override func viewDidLoad() {
            super.viewDidLoad()
            id = "123"
            // myContainerView.delegate = self //myContainerView is nil here. We set it in prepareForSegue
        }
    
        func initialize() -> String {
            return id
        }
    
        let embedSegueID = "the identifier you set to your embed segue in Storyboard"
    
        override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
            if (segue.identifier == embedSegueID) {
                let dvc = segue.destination as! ContainerView
                // Now you have a pointer to EmbeddedViewController.
                // You can save the reference to it, or pass data to it.
                myContainerView = dvc
                myContainerView.delegate = self
            }
            print(segue.identifier)
        }
    }
    

如果您想将数据从您的 ViewController 传递到另一个 ViewController,它嵌入在您的目的地ViewController(我如何理解您的问题),我会:

  • 将其传递到目的地ViewController,如上例所示 (prepareForSegue)
  • 而不是从目的地ViewController.
  • 将其传递给 viewWillAppear() 中的另一个ViewController

在这种情况下,我如何理解你的用例,你不需要委托并且可以删除所有与委托相关的代码(initializeContainerViewDelegate 协议,属性 var delegate: ContainerViewDelegate! 以及对它的所有调用。