Segue to another storyboard?
Asked Answered
E

6

137

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.

Evocation answered 5/3, 2012 at 23:28 Comment(4)
Look at this answer https://mcmap.net/q/130853/-using-multiple-storyboards-in-iosDisaccord
Great question. Having one storyboard is a nightmare for team based projects. We regularly break projects into storyboards by "flow" (one storyboard for login, one storyboard for news feed and related screens, etc). It helps minimize the number of merge conflicts, which would otherwise occur every time a developer touches the storyboard.Calfskin
@BrianSachetta What else do you do? Any other good similar tips to share?Detoxify
It depends on your team structure. If you really wanted to, you could have all your user interfaces in separate .xib files. This is how it used to be before storyboards existed. There are plusses and minuses to this approach. The upside is that you'll almost never have conflicts with other developers on the project. The downside is it can be hard to see the app flow visually.Calfskin
D
200

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];
Delorenzo answered 7/3, 2012 at 23:50 Comment(11)
I just really want to keep the storyboards separate; they're already much too cluttered.Evocation
Just like chapters in a book, I see the need for multiple storyboards.Scrutable
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.Dinesen
This doesn't allow you to use custom segues for the transition.Gladstone
I suspect that in iOS 9 it will become possible to segue from one storyboard to another automatically.Regulator
In iOS 9 and Xcode 7, cross-storyboard references are now supported. :-)Thorwald
Note that if the initial view controller is a navigationcontroller, you need to use presentViewController instead of pushViewControllerElapse
See milczi's answer, you can do this now very easily in the UI!Exposed
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.Mehta
i tried segue identifier in an other storyboard and got the error: doesn't contain a view controller with identifierJeb
@Jeb 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.Delorenzo
R
130

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

Rosierosily answered 17/11, 2015 at 9:21 Comment(6)
Good info, however the question is tagged ios5 so this doesn't apply.Delorenzo
@Inafziger yes but this question shows up at the top of search results for people using iOS 9Cheat
This is available from XCode 7 onwards. See more info at #30772645Unconquerable
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?Strontianite
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.Kristalkristan
QUESTION: How do I pass an object forward with this? It isn't working with segue.deastination as! MyViewControllerEllmyer
V
10

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.

Voroshilovsk answered 11/3, 2012 at 22:31 Comment(4)
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.Capitol
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.Voroshilovsk
In my case, the performance problem is usually in Xcode ... Apple's current implementation of the storyboard editor is weak.Whoa
A 60-scene Storyboard takes 13 seconds to open on a 2014 Mac Pro. I have filed a radar.Lenoralenore
B
7

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
Backset answered 14/3, 2012 at 9:54 Comment(3)
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!Langouste
And yet the native iPhone Music app does exactly that ("Now Playing" part).Howze
FYI: iPhone music app doesn't have TabbarController in "Now playing" screen.Thoroughfare
B
4

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)
}
Broker answered 12/3, 2016 at 3:46 Comment(1)
This is not segueDated
F
-1

did you try the following :

2/ click to select your view controller which is linked to your navigation controller and in top menu : editor -> embed in -> Tab Bar controller

Note : I didn't test it because I'm using the opposite : making tabbed bar apps and puting navigation controller inside).

Fervent answered 14/3, 2012 at 22:8 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.