使用instantiateViewControllerWithIdentifier和performseguewithidentifier有什么区别?

Mic*_*ael 8 oop ios swift

这两种方法都允许我提供一个新的视图控制器(一个通过调用presentviewcontroller),所以我不明白两者之间的区别以及何时应该使用它们.

Fir*_*iro 8

他们都参考故事板相关的标识符.主要区别是one(performSegueWithIdentifer)基于segue的末端(segue指向的地方)实例化对象,而另一个(instantiateViewControllerWithIdentifier)基于VC的标识符(而不是segue)实例化唯一的VC.

您可以在故事板中的不同位置具有多个具有相同标识符的segue,而故事板中的VC不能具有相同的标识符.


小智 8

performSegueWithIdentiferinstantiateViewControllerWithIdentifier都用于从一个viewController移动到另一个viewController.但是存在很多差异......

  1. 第一种情况的标识符定义了像push,modal,custom等的segue,它们用于执行从一个VC到另一个VC的特定类型的转换.例如.

    self.performSegueWithIdentifier("push", sender: self);`
    
    Run Code Online (Sandbox Code Playgroud)

    其中"推"是推送segue的标识符.

    第二种情况的标识符定义了一个VC,如myViewController,myTableViewController,myNavigationController等.第二个函数用于从storyBoard中的VC转到特定的VC(带标识符.).例如.

    var vc = mainStoryboard.instantiateViewControllerWithIdentifier("GameView") as GameViewController; 
    self.presentViewController(VC, animated: true, completion: nil) ;
    
    Run Code Online (Sandbox Code Playgroud)

    其中"GameView"是GameViewController的标识符.这里创建了一个GameViewController实例,然后调用函数presentViewController转到实例化的vc.

  2. 对于第一种情况,在segue标识符的帮助下,你可以传递一个更多的变量值到下一个VC.例如.

    override func prepareForSegue(segue: UIStoryboardSegue!, sender: AnyObject!) 
    {
        if (segue.identifier == "push") 
        {
            let game = segue.destinationViewController as GameViewController
            game.value = self.myvalue // *value* is an Int variable of GameViewController class and *myvalue* is an Int variable of recent VC class.
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)

    当self.performSegueWithIdentifier("push",sender:self)时,也会调用此函数; 被调用以将值传递给GameViewController.

    但在第二种情况下可能直接喜欢,

    var vc = mainStoryboard.instantiateViewControllerWithIdentifier("GameView") as GameViewController; 
    vc.value = self.myvalue;
    self.presentViewController(VC, animated: true, completion: nil) ;
    
    Run Code Online (Sandbox Code Playgroud)