推送的视图控制器未接收数据

时间:2017-03-24 14:22:27

标签: swift3 xcode8 pushviewcontroller

问题

之前我已将数据发送到其他ViewControllers,但无法弄清楚为什么这种情况不起作用。情况如下

  1. FirstViewController和SecondViewController存在于不同的Storyboards
  2. 在我们以编程方式推送SecondViewController之前,我的FirstViewController将需要发送到SecondViewController的一些数据。这是通过以下方式完成的:

    @IBAction func someButtonPressed(_ sender: UIButton) {    
    let storyBoard = UIStoryboard(name: "SecondStoryBoard", bundle: nil)
    
        if let secondViewController = storyBoard.instantiateInitialViewController() as? ResultsViewController {
            secondViewController.var1 = self.var1
    
            // Sanity check
            print("set secondViewController.var1 to \(self.var1)") // Printed data as expected
    
            self.navigationController?.pushViewController(secondViewController, animated: true)
        }
    }
    
    1. 我的SecondViewController将测试数据是否在其ViewDidLoad中正确设置。这是通过以下方式完成的:

      override func viewDidLoad() {
          super.viewDidLoad()
      
          if let var1 = self.var1 {
              print("SUCCESS: var1 was set!")
          } else {
              print("FAILURE: var1 is nil! Crash imminent") // Printed here, hence my problem
          }
      }
      
  3. 我尝试过的事情:

    1. 在SecondViewController中为var1创建getter和setter,并观察它们何时被设置/获取。该变量由FirstViewController中的someButtonPressed设置在适当的行,但是当if let var1 = self.var1在FirstViewController中调用getter时,该值为nil。

    2. 在SecondViewController中的var1上放置断点。我看到变量初始化为nil,因为它是一个可选的集合,后来又设置为nil(再次没有再次调用setter)

1 个答案:

答案 0 :(得分:0)

发现问题

问题在于SecondViewController的View的以下屏幕截图。

(注意:让ResultsViewController = SecondViewController)

Let ResultsViewController = SecondViewController

从图中可以看出,这不是标准的简单视图,您可以在指南中找到如何将数据从一个ViewController传递到另一个ViewController的视图。我的问题在于我们有一个View嵌入另一个视图。我没有意识到,即使它在Xcode的界面构建器中列出,嵌入也是一种segues。

当将数据传递给SecondViewController时,我忽略了嵌入内部视图的外部视图。两个视图都将其自定义类设置为SecondViewController,但这只是掩盖了上述断点情况的问题。

发生的事情是,我实例化了外部视图,成功地将数据设置为SecondViewController,然后它转向其内部视图,并且所述内部视图的SecondViewController将具有默认值零值。

解决方案

为了解决这个问题,我写了一个

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if(segue.identifier == "secondViewController") {
        if let secondViewController = segue.destination  as? SecondViewController {
            secondViewController.var1 = self.var1
        }
    }
}
在SecondViewController中

,这样当外部视图向内部移动时,它就会传递其数据。

我也可能应该同时拥有内部和外部视图,以便单独使用ViewControllers以避免混淆。