prepareForSegue如何运作? (将数据传递给下一个视图控制器)

时间:2015-12-27 16:57:04

标签: ios swift segue

我正在学习Swift和iOS开发,我发现在视图控制器之间传递数据的一种非常方便的方法是使用segue.destinationViewController方法中的prepareForSegue(_:sender:)属性。现在,虽然我知道如何使用它,但我并没有确切地知道它是如何工作的。

考虑以下代码来自this Apple tutorial

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if segue.identifier == "ShowDetail" {
        let mealDetailViewController = segue.destinationViewController as! MealViewController

        if let selectedMealCell = sender as? MealTableViewCell {
            let indexPath = tableView.indexPathForCell(selectedMealCell)!
            let selectedMeal = meals[indexPath.row]
            mealDetailViewController.meal = selectedMeal
        }
    }
    else if segue.identifier == "AddItem" {
        print("Adding new meal.")
    }
}

我想知道如何在mealDetailViewController上设置属性(MealViewController的实例存储在本地常量中,因为我(错误地?)理解的内容)在实际管理它的视图控制器中找到当prepareForSegue返回时的下一个视图。

你能解释一下这是如何工作的以及执行segue时会发生什么?

1 个答案:

答案 0 :(得分:1)

当您的代码或某些内置按钮操作触发segue时,会创建UIStoryboardSegue的实例。在那个segue中有一些有趣的属性,比如destinationViewController。由于您在故事板中设置了segue,因此操作系统知道您要转换的ViewController。因此,它创建了一个ViewController的实例,在本例中是MealViewController的实例,并将该控制器存储在属性destinationViewController中。然后它做了一些你不需要担心的事情。

然后重要的部分是在当前呈现的ViewController上调用方法prepareForSegue,在这种情况下,这是您发布的确切方法。那个控制器现在可以继续做出决定,或者不想传递数据或者打印一些东西或者发送一些东西到服务器,因为你已经完成了这个控制器,或者你想要的任何东西。

请注意,此处创建 MealViewController的实例非常重要,但要检索已创建的实例并将其存储为局部常量(正如您正确观察到的那样)。

当你的方法返回时,调用者/ UIKit继续前进并做更多的事情,最终导致屏幕上发生实际的动画过渡。