我正在学习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时会发生什么?
答案 0 :(得分:1)
当您的代码或某些内置按钮操作触发segue时,会创建UIStoryboardSegue
的实例。在那个segue中有一些有趣的属性,比如destinationViewController
。由于您在故事板中设置了segue,因此操作系统知道您要转换的ViewController。因此,它创建了一个ViewController的实例,在本例中是MealViewController
的实例,并将该控制器存储在属性destinationViewController
中。然后它做了一些你不需要担心的事情。
然后重要的部分是在当前呈现的ViewController上调用方法prepareForSegue
,在这种情况下,这是您发布的确切方法。那个控制器现在可以继续做出决定,或者不想传递数据或者打印一些东西或者发送一些东西到服务器,因为你已经完成了这个控制器,或者你想要的任何东西。
请注意,此处创建 MealViewController
的实例非常重要,但要检索已创建的实例并将其存储为局部常量(正如您正确观察到的那样)。
当你的方法返回时,调用者/ UIKit继续前进并做更多的事情,最终导致屏幕上发生实际的动画过渡。