Segue to another storyboard?

54,132

Solution 1

Yes, but you have to do it programmatically:

// Get the storyboard named secondStoryBoard from the main bundle:
UIStoryboard *secondStoryBoard = [UIStoryboard storyboardWithName:@"secondStoryBoard" bundle:nil];

// Load the initial view controller from the storyboard.
// Set this by selecting 'Is Initial View Controller' on the appropriate view controller in the storyboard.
UIViewController *theInitialViewController = [secondStoryBoard instantiateInitialViewController];
//
// **OR**  
//
// Load the view controller with the identifier string myTabBar
// Change UIViewController to the appropriate class
UIViewController *theTabBar = (UIViewController *)[secondStoryBoard instantiateViewControllerWithIdentifier:@"myTabBar"];

// Then push the new view controller in the usual way:
[self.navigationController pushViewController:theTabBar animated:YES];

Solution 2

From Xcode 7 onwards, you can do this graphically by using a Storyboard Reference:

reference

Add Storyboard Reference to your storyboard. Create segue between ViewController and Storyboard Reference (ctrl + drag)

Then fill this fields.

enter image description here

Where "Tutorial" is "Tutorial.storyboard" file and "MainTutorialController" is your "Storyboard ID" field in ViewControllerSettings

Solution 3

You can't really do segues manually because UIStoryboardSegue is an abstract class. You need to subclass it and implement perform in order for it to do anything. They're really meant to be created in storyboards. You can push the view controller manually, though, which is a good solution. lnafziger's answer does this well:

UIStoryboard *secondStoryBoard = [UIStoryboard storyboardWithName:@"secondStoryBoard" bundle:nil];
UIViewController *theTabBar = [secondStoryBoard instantiateViewControllerWithIdentifier:@"myTabBar"];
[self.navigationController pushViewController:theTabBar animated:YES];

One thing to note, though, is that you've said you want to keep things nice and separate. The idea of storyboards is to allow you to keep things separate while doing all of your design work in one place. Each view controller is nice and separated within the storyboard from the others. The whole idea is to keep it all in one place. Just lay it out nicely so that it's organized, and you'll be good to go. You shouldn't separate it unless you have a really good reason to do so.

Solution 4

You should not place UITabBarControllers in a UINavigationController. It's asking for bugs such as incorrect autorotation/view unloading etc., as Apple doesn't support this sort of containment:

When combining view controllers, however, the order of containment is important; only certain arrangements are valid. The order of containment, from child to parent, is as follows:

  • Content view controllers, and container view controllers that have flexible bounds (such as the page view controller)
  • Navigation view controller
  • Tab bar controller
  • Split view controller

Solution 5

Here is a swift version:

let targetStoryboardName = "Main"
let targetStoryboard = UIStoryboard(name: targetStoryboardName, bundle: nil)
if let targetViewController = targetStoryboard.instantiateInitialViewController() {
    self.navigationController?.pushViewController(targetViewController, animated: true)
}
Share:
54,132
Ry-
Author by

Ry-

If you don’t use code formatting for emphasis, we can probably be friends.

Updated on July 08, 2022

Comments

  • Ry-
    Ry- almost 2 years

    Is it possible to segue from one storyboard to another, or to embed a storyboard in a view controller in another storyboard? I need to place a UITabBarController in a UINavigationController, and I'd like to keep them nice and separate.

  • calimarkus
    calimarkus about 12 years
    merging storyboards doesn't work very well, so in a multi-developer-environnment, it could be interesting to use seperate storyboards. Also the performance can get pretty bad in big projects with a single storyboard.
  • wbyoung
    wbyoung about 12 years
    We use multiple storyboards, but the point is you can't really do that and segue between them. Apple designed it so you could do everything in one place, so the idea is kind of to use just one (not that you can't). Performance should not be an issue. The storyboard is compiled into separate nib files for each view controller. You should get very good performance from storyboards. The performance will be just as good as if you had separate xibs for every view controller.
  • Ry-
    Ry- about 12 years
    I just really want to keep the storyboards separate; they're already much too cluttered.
  • Hubert Kunnemeyer
    Hubert Kunnemeyer about 12 years
    I totally agree, and for multiple reasons. Putting a TabBarController inside of a NavigationController is not a good idea, because the delegates would not fire correctly for the views contained inside them, and the end user will have a terrible time navigating the interface. They would have a hard time getting back to the controller that leads out of the TabBar/Navigation interface. The other way around, is OK, A NavigationController inside a TabBarController. It's always best to not confuse the the end user and listen to Apples suggestions!
  • finneycanhelp
    finneycanhelp almost 12 years
    Just like chapters in a book, I see the need for multiple storyboards.
  • Adam
    Adam over 11 years
    In my case, the performance problem is usually in Xcode ... Apple's current implementation of the storyboard editor is weak.
  • Lee
    Lee over 11 years
    When you have multiple developers working on the same application, it becomes very useful to have multiple storyboards because resolving version control conflicts in the storyboard xml is quite painful at times.
  • Enzo Tran
    Enzo Tran almost 11 years
    And yet the native iPhone Music app does exactly that ("Now Playing" part).
  • xissburg
    xissburg almost 10 years
    This doesn't allow you to use custom segues for the transition.
  • Robert Atkins
    Robert Atkins over 9 years
    A 60-scene Storyboard takes 13 seconds to open on a 2014 Mac Pro. I have filed a radar.
  • matt
    matt about 9 years
    I suspect that in iOS 9 it will become possible to segue from one storyboard to another automatically.
  • Quinn Taylor
    Quinn Taylor almost 9 years
    In iOS 9 and Xcode 7, cross-storyboard references are now supported. :-)
  • sgdesmet
    sgdesmet almost 9 years
    Note that if the initial view controller is a navigationcontroller, you need to use presentViewController instead of pushViewController
  • sanjana
    sanjana over 8 years
    FYI: iPhone music app doesn't have TabbarController in "Now playing" screen.
  • Tim
    Tim over 8 years
    See milczi's answer, you can do this now very easily in the UI!
  • lnafziger
    lnafziger over 8 years
    Good info, however the question is tagged ios5 so this doesn't apply.
  • Brian Ogden
    Brian Ogden about 8 years
    @Inafziger yes but this question shows up at the top of search results for people using iOS 9
  • user2067021
    user2067021 about 8 years
    iOS 8 also supports storyboard references. From Apple's documentation: Storyboard references require an app targeting at least iOS 8.0, OS X 10.10, or watchOS 1.0.
  • Simon Pickup
    Simon Pickup over 7 years
    This is available from XCode 7 onwards. See more info at stackoverflow.com/questions/30772145/…
  • user1709076
    user1709076 over 7 years
    i tried segue identifier in an other storyboard and got the error: doesn't contain a view controller with identifier
  • lnafziger
    lnafziger over 7 years
    @user1709076 You have to set the identifier by setting the Storyboard ID (in the Storyboard editor) to the same identifier that you are using to reference it in the first line of code.
  • Gil Beyruth
    Gil Beyruth about 7 years
    This worked, but I also need to keep the navigation bar, it is showing without the navigation bar, is there any way to keep a navigation and button to move it back on history, doesn't matter what storyboard it comes from?
  • Mark Reid
    Mark Reid about 7 years
    This is working for me in iOS 10. I did note that I need one storyboard reference per segue and couldn't connect multiple segues to one reference point.
  • Jude Michael Murphy
    Jude Michael Murphy almost 7 years
    QUESTION: How do I pass an object forward with this? It isn't working with segue.deastination as! MyViewController
  • Naval Hasan
    Naval Hasan about 3 years
    This is not segue