如何在viewDidLoad()中发生segue?

时间:2016-11-02 16:33:19

标签: ios swift segue

我正试图以与此类似的方式发生一场声音:

viedDidLoad(){
    if 0==0 {
        *segue happens*
    }
}

但我看到的所有建议都很陈旧,使用的performSegueWithIdentifier已不再有效。如果它是有用的信息,我也使用导航栏,但是,它不需要使用此ViewController,因为如果用户单击按钮(即接受和拒绝),ViewController只应更改视图。

2 个答案:

答案 0 :(得分:1)

您应该在viewDidAppear而不是viewDidLoad中执行您的segue,因为在创建ViewController对象并且尚未将其附加到窗口时调用viewDidLoad。

答案 1 :(得分:0)

正如@livenplay所提到的,你不应该偏离viewDidLoad

我会更进一步,并建议您根本不进行segue,而是从代码中实例化视图控制器,然后手动推送/显示它。

这将为您带来以下好处:

  1. 您不使用非常容易出错的标识符方法
  2. 您可以为该视图控制器创建自定义初始化方法,并在需要时传入各种参数。
  3. 您可以在其他地方重用该初始化方法,而不是在故事板中为不同的用例重新创建segue。
  4. 一些示例代码可以演示我的意思:

    class MyViewController: UIViewController {
        static func initialize(with someArgument: Any) -> MyViewController {
            let myVC = UIStoryboard(name: "main", bundle: nil).instantiateViewController(withIdentifier: "MyVCIdentifier") as? MyViewController
            // do something here with the passed argument
    
            return myVC! // force unwrapping for brevity... don't do this in your code :)
        }
    }
    
    class StartingViewController: UIViewController {
        override func viewDidLoad() {
            let myVC = MyViewController.initialize(with: "someArgument")
    
            // I propose that this...
            self.navigationController?.pushViewController(myVC, animated: true)
            self.present(myVC, animated: true, completion: nil)
    
            //... is much better and more re-usable than this..
            self.performSegue(withIdentifier: "MyVCSegueIdentifier", sender: self)
        }
    }