Swift3 推送视图控制器未接收数据 问题

Swift3 推送视图控制器未接收数据 问题,swift3,xcode8,pushviewcontroller,Swift3,Xcode8,Pushviewcontroller,我以前曾向其他ViewController发送过数据,但无法找出这种情况不起作用的原因。情况如下 FirstViewController和SecondViewController存在于不同的故事板中 在我们以编程方式推送SecondViewController之前,我的FirstViewController将有一些数据需要发送到SecondViewController。这是通过以下方式实现的: @IBAction func someButtonPressed(_ sender: UIButton

我以前曾向其他ViewController发送过数据,但无法找出这种情况不起作用的原因。情况如下

  • FirstViewController和SecondViewController存在于不同的故事板中
  • 在我们以编程方式推送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)
        }
    }
    
    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
        }
    }
    
  • 我的SecondViewController将测试数据在其ViewDidLoad中是否设置正确。这是通过以下方式实现的:

    @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)
        }
    }
    
    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
        }
    }
    
  • 我尝试过的事情:
  • 在SecondViewController中为var1创建getter和setter,并观察它们何时被设置/获取。变量由FirstViewController中的someButtonPressed设置在适当的行上,但当if let var1=self.var1调用FirstViewController中的getter时,该值为nil

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

  • 发现问题 问题在于SecondViewController视图的以下屏幕截图

    (注意:让ResultsViewController=SecondViewController)

    从图中可以看出,这不是关于如何将数据从一个ViewController传递到另一个ViewController的指南中的标准简单视图。我的问题在于我们有一种观点,另一种观点。我没有意识到,即使它列在Xcode的interface builder中,嵌入也是一种segues类型

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

    所发生的事情是,我实例化了外部视图,成功地将数据设置为其SecondViewController,然后它将切换到其内部视图,并说内部视图的SecondViewController将具有默认的nil值


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

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if(segue.identifier == "secondViewController") {
            if let secondViewController = segue.destination  as? SecondViewController {
                secondViewController.var1 = self.var1
            }
        }
    }
    
    在SecondViewController中,这样当外部视图切换到内部视图时,它将传递其数据

    我也可能应该有两个视图,内部和外部,有单独的视图控制器,以避免混淆