Segue to another storyboard?
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:
Add Storyboard Reference to your storyboard. Create segue between ViewController and Storyboard Reference (ctrl + drag)
Then fill this fields.
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)
}
Ry-
If you don’t use code formatting for emphasis, we can probably be friends.
Updated on July 08, 2022Comments
-
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 aUINavigationController
, and I'd like to keep them nice and separate. -
calimarkus about 12 yearsmerging 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 about 12 yearsWe 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- about 12 yearsI just really want to keep the storyboards separate; they're already much too cluttered.
-
Hubert Kunnemeyer about 12 yearsI 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 almost 12 yearsJust like chapters in a book, I see the need for multiple storyboards.
-
Adam over 11 yearsIn my case, the performance problem is usually in Xcode ... Apple's current implementation of the storyboard editor is weak.
-
Lee over 11 yearsWhen 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 almost 11 yearsAnd yet the native iPhone Music app does exactly that ("Now Playing" part).
-
xissburg almost 10 yearsThis doesn't allow you to use custom segues for the transition.
-
Robert Atkins over 9 yearsA 60-scene Storyboard takes 13 seconds to open on a 2014 Mac Pro. I have filed a radar.
-
matt about 9 yearsI suspect that in iOS 9 it will become possible to segue from one storyboard to another automatically.
-
Quinn Taylor almost 9 yearsIn iOS 9 and Xcode 7, cross-storyboard references are now supported. :-)
-
sgdesmet almost 9 yearsNote that if the initial view controller is a navigationcontroller, you need to use
presentViewController
instead ofpushViewController
-
sanjana over 8 yearsFYI: iPhone music app doesn't have TabbarController in "Now playing" screen.
-
Tim over 8 yearsSee milczi's answer, you can do this now very easily in the UI!
-
lnafziger over 8 yearsGood info, however the question is tagged ios5 so this doesn't apply.
-
Brian Ogden about 8 years@Inafziger yes but this question shows up at the top of search results for people using iOS 9
-
user2067021 about 8 yearsiOS 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 over 7 yearsThis is available from XCode 7 onwards. See more info at stackoverflow.com/questions/30772145/…
-
user1709076 over 7 yearsi tried segue identifier in an other storyboard and got the error: doesn't contain a view controller with identifier
-
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 about 7 yearsThis 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 about 7 yearsThis 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 almost 7 yearsQUESTION: How do I pass an object forward with this? It isn't working with segue.deastination as! MyViewController
-
Naval Hasan about 3 yearsThis is not segue