UIStoryboard: What's the Correct Way to Get the Active Storyboard?

后端 未结 4 1997
无人及你
无人及你 2020-12-13 03:56

I am currently furiously digging through all the docs, and haven\'t quite found what I\'m looking for. I suspect it is a real d\'oh! answer.

I simply need to find th

相关标签:
4条回答
  • 2020-12-13 04:15

    In Swift, you'd use the following syntax:

    let storyboard = UIStoryboard(name: "Main", bundle: nil) 
    

    Note that passing nil to bundle will make the call refer to your main bundle automatically.

    If you're in a view controller that you have on the Storyboard and want to instantiate the Storyboard from there directly, you can just do:

    let storyboard: UIStoryboard? = self.storyboard // call this inside a VC that is on the Storyboard
    

    Note that in the last case, self.storyboard will return an optional Storyboard (Storyboard?), so if you'd like to use it unwrap it like so:

    if let storyboard = self.storyboard {
      // access storyboard here
    }
    
    0 讨论(0)
  • 2020-12-13 04:27

    OK. As my comment above indicates, I found the answer to the (badly phrased question):

    I wanted to be able to get the main (not active) storyboard, as I'm not using multiple storyboards per incarnation. I'm using the standard model of 1 storyboard for iPhone, and 1 for iPad. I just wanted the cleanest way to get the storyboard, so that I could use it to generate a view controller.

    I found the answer in this post on Stack Overflow, and implemented it with the following code:

    UIStoryboard *st = [UIStoryboard storyboardWithName:[[NSBundle mainBundle].infoDictionary objectForKey:@"UIMainStoryboardFile"] bundle:[NSBundle mainBundle]];
    
    0 讨论(0)
  • 2020-12-13 04:27

    I have just copy pasted the code form above updated question so that everyone can see it as an answer.

    UIStoryboard *st = [UIStoryboard storyboardWithName:[[NSBundle mainBundle].infoDictionary objectForKey:@"UIMainStoryboardFile"] bundle:[NSBundle mainBundle]];
    
    0 讨论(0)
  • 2020-12-13 04:33

    In case you want to get the active storyboard for a viewController, there's a storyboard property. This is how I solved it, instead of making a new instance:

    LoginViewController *vc = [navController.storyboard instantiateViewControllerWithIdentifier:@"firstLaunch"];
    [navController presentModalViewController:vc animated:YES];
    

    In Swift you'd call:

    let loginViewController = navigationController?.storyboard?.instantiateViewController(withIdentifier: "firstLaunch") as! LoginViewController
    navigationController?.present(loginViewController, animated: true, completion: nil)
    

    You could also be a lot safer by using guards against the navigation controller and the storyboard. I've used as! so as to guarantee that you're getting a LoginController.

    0 讨论(0)
提交回复
热议问题