声明ViewController对象的两种方式之间的区别

时间:2017-12-31 05:09:34

标签: swift

所以我尝试了这两种声明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
    }
}

2 个答案:

答案 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并让我知道是否有任何问题

相关问题