所以我尝试了这两种声明ViewController变量的方法,它似乎给了我相同的结果。但是,我觉得设置destinationVC变量之间一定有区别,因为如果没有,人们会不会使用更直接的方式来声明一个新对象?
[使用segue.destination作为! ViewControllerName]
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "changeCityName" {
let destinationVC = segue.destination as! ChangeCityViewController
destinationVC.delegate = self
}
}
[使用ViewControllerName()]
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "changeCityName" {
let destinationVC = ChangeCityViewController()
destinationVC.delegate = self
}
}
答案 0 :(得分:0)
在prepareForSegue
方法中,这两种创建新VC的方法差异很大。
如果您使用segue.destination
,则可以参考segue将要访问的特定VC,即您的故事板中segue所连接的VC。如果您创建了一个新VC,那么您创建的VC将不会与segue相同。即你正在处理一个单独的VC。设置新创建的VC的委托不会对实际呈现的VC做任何事情。
如果您正在谈论使用segue呈现VC与此之间的区别:
let vc = SomeViewController()
self.present(vc, animated: true)
然后差异就越小。如果使用segues,则将从storyboard(NIB)文件中读取视图控制器中的视图。如果通过调用初始化程序创建VC,则必须处理在视图控制器类中添加视图。
答案 1 :(得分:0)
结果可能在视觉上相同,但不是真的。
如果你没有把任何代码放在prepare(for segue)中,你仍会得到相同的结果(视觉上)
当通过故事板连接UIViewControllers时,会调用prepare(for segue)。
由于UIViewControllers已经在storyboard中连接,因此在您想要的事件上调用目标UIViewController。
在第一种情况中使用(segue.destination为!ViewControllerName),这是使用segue的正确方法。
在进一步讨论之前,还有一件事要讨论,那就是
为什么我们需要在prepare(for segue)中编写代码(如果已经通过故事板连接)
1.从一个按钮操作,您可以根据您的要求连接多个segue,但每按一次按钮,将调用prepare(for segue)方法,因此要区分要调用的UIViewController,我们会这样做
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if(segue.identifier == "FirstViewControllerIdentifier")
{
}else if(segue.identifier == "SecondViewControllerIdentifier"){
}else if(segue.identifier == "ThirdViewControllerIdentifier"){
}else{
// and so no
}
}
现在我们已经准备好了目标控制器(UIViewController)的对象。所以我们不需要创建目标控制器的新对象
2.我们可以将数据传递到目标控制器,也可以设置委托
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if(segue.identifier == "FirstViewControllerIdentifier")
{
// here we get object of first view controller and set delegate
let firstVC = segue.destination as! FirstViewController
firstVC.delegate = self
}else if(segue.identifier == "SecondViewControllerIdentifier"){
// here we get object of second view controller and pass some data to it
let secondVC = segue.destination as! SecondViewController
secondVC.someData = someData
}else if(segue.identifier == "ThirdViewControllerIdentifier"){
}else{
// and so no
}
}
现在使用ViewControllerName()(错误的代码)
第二种情况override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if(segue.identifier == "FirstViewControllerIdentifier")
{
// here we create object of first view controller.This object is different from the destination view controller
//you create an object and set a delegate but after that you are not using that object and that object is totallu useless.
let firstVC = FirstViewController()
firstVC.delegate = self
// above code does not affect any thing but the contoller which is to be presented is destination view controller which is connected through storyboard
}
}
希望您了解如何使用segue并让我知道是否有任何问题