When to use Storyboard and when to use XIBs
Asked Answered
C

9

201

Are there any guidelines on when to use storyboards in an iOS project and when to use XIBs? what are the pros and cons of each and what situations do they each suit?

Near as I can tell it's not that clean to use storyboard segues when you have view controllers being pushed by dynamic UI elements (Like map pins).

Canady answered 22/2, 2012 at 22:50 Comment(1)
If you want that your app turn also on iOS4, you have no choice: you can't use storyboard in that caseKyl
V
176

I have used XIBs extensively and completed two projects using Storyboards. My learnings are:

  • Storyboards are nice for apps with a small to medium number of screens and relatively straightforward navigation between views.
  • If you have lots of views and lots of cross-navigation between them the Storyboard view gets confusing and too much work to keep clean.
  • For a large project with multiple developers I would not use Storyboards because you have a single file for your UI and cannot easily work in parallel.
  • It might be worth for large apps to split up into multiple storyboard files but I have not tried that. This answer shows how to do segues between storyboards.
  • You still need XIBs: In both of my Storyboard projects I had to use XIBs for custom table cells.

I think Storyboards are a step in the right direction for UI implementation and hope Apple will extend them in future iOS versions. They need to resolve the "single file" issue though, otherwise they won't be attractive for larger projects.

If I start a small size app and can afford iOS5 only compatibility, I would use Storyboards. For all other cases I stick to XIBs.

Virtuoso answered 1/5, 2012 at 16:32 Comment(7)
Two things. 1) You can make custom table cells (they call them prototype cells) in storyboards and 2) You can use multiple storyboard files. See my answer here: https://mcmap.net/q/129587/-segue-to-another-storyboard for details how.Lewin
Thanks. I added the link to your answer. As for the custom cells: Prototype cells did not work for me because I need to reuse custom cells across multiple views. So I had to revert to XIBs.Virtuoso
Merging storyboards has been significantly improved in Xcode 5.x as the XML markup has been greatly simplified.Buy
I think it all depends on the project morphology (prototype?,large scale project?, already designed?, etc...) Here are my thoughts polarios.co/2014/08/04/storyboard-xibs-coOrna
"If you have lots of views and lots of cross-navigation between them the Storyboard view gets confusing and too much work to keep clean" I don't agree on that, you just need to figure out proper flow to do it, you can avoid most of the segues with a proper design.Equip
Creating custom cells in storyboard is not a good idea @lnafziger, it is a mess and you usually use the cell in many situations. However, you should use multiple storyboards depending on the flow. Storyboards are the future if we talk about view controllers, otherwise it is not necessary and useful.Pipistrelle
@Virtuoso You mentioned that you use xibs for table view cells that are used in multiple view controllers. How do you set this up? Specifically the file's owner and class. I would really appreciate any help, I haven't found any clear way of doing this.Tears
D
226

Update 1/12/2016: It's 2016 and I still prefer laying out my UIs in code and not in Storyboards. That being said, Storyboards have come a long way. I have removed all the points from this post that simply do not apply anymore in 2016.

Update 4/24/2015: Interestingly Apple doesn't even use Storyboards in their recently open-sourced ResearchKit as Peter Steinberger has noticed (under the subheading "Interface Builder").

Update 6/10/2014: As expected, Apple keeps improving Storyboards and Xcode. Some of the points that applied to iOS 7 and below don't apply to iOS 8 anymore (and are now marked as such). So while Storyboards inherently still have flaws, I revise my advice from don't use to selectively use where it makes sense.

Even now that iOS 9 is out, I would advise against to use caution when deciding whether to use Storyboards. Here are my reasons:

  • Storyboards fail at runtime, not at compile time: You have a typo in a segue name or connected it wrong in your storyboard? It will blow up at runtime. You use a custom UIViewController subclass that doesn't exist anymore in your storyboard? It will blow up at runtime. If you do such things in code, you will catch them early on, during compile time. Update: My new tool StoryboardLint mostly solves this problem.

  • Storyboards get confusing fast: As your project grows, your storyboard gets increasingly more difficult to navigate. Also, if multiple view controllers have multiple segues to multiple other view controllers, your storyboard quickly starts to look like a bowl of spaghetti and you'll find yourself zooming in and out and scrolling all over the place to find the view controller you are looking for and to find out what segue points where. Update: This problem can mostly be solved by splitting your Storyboard up into multiple Storyboards, as described in this article by Pilky and this article by Robert Brown.

  • Storyboards make working in a team harder: Because you usually only have one huge storyboard file for your project, having multiple developers regularly making changes to that one file can be a headache: Changes need to be merged and conflicts resolved. When a conflict occurs, it is hard to tell how to resolve it: Xcode generates the storyboard XML file and it was not really designed with the goal in mind that a human would have to read, let alone edit it.

  • Storyboards make code reviews hard or nearly impossible: Peer code reviews are a great thing to do on your team. However, when you make changes to a storyboard, it is almost impossible to review these changes with a different developer. All you can pull up is a diff of a huge XML file. Deciphering what really changed and if those changes are correct or if they broke something is really hard.

  • Storyboards hinder code reuse: In my iOS projects, I usually create a class that contains all the colors and fonts and margins and insets that I use throughout the app to give it a consistent look and feel: It's a one line change if I have to adjust any of those values for the whole app. If you set such values in the storyboard, you duplicate them and will need to find every single occurrence when you want to change them. Chances are high that you miss one, because there's no search and replace in storyboards.

  • Storyboards require constant context switches: I find myself working and navigating much faster in code than in storyboards. When your app uses storyboards, you constantly switch your context: "Oh, I want a tap on this table view cell to load a different view controller. I now have to open up the storyboard, find the right view controller, create a new segue to the other view controller (that I also have to find), give the segue a name, remember that name (I can't use constants or variables in storyboards), switch back to code and hope I don't mistype the name of that segue for my prepareForSegue method. How I wish I could just type those 3 lines of code right here where I am!" No, it's not fun. Switching between code and storyboard (and between keyboard and mouse) gets old fast and slows you down.

  • Storyboards are hard to refactor: When you refactor your code, you have to make sure it still matches what your storyboard expects. When you move things around in your storyboard, you will only find out at runtime if it still works with your code. It feels to me as if I have to keep two worlds in sync. It feels brittle and discourages change in my humble opinion.

  • Storyboards are less flexible: In code, you can basically do anything you want! With storyboards you are limited to a subset of what you can do in code. Especially when you want to do some advanced things with animations and transitions you will find yourself "fighting the storyboard" to get it to work.

  • Storyboards don't let you change the type of special view controllers: You want to change a UITableViewController into a UICollectionViewController? Or into a plain UIViewController? Not possible in a Storyboard. You have to delete the old view controller and create a new one and re-connect all the segues. It's much easier to do such a change in code.

  • Storyboards add two extra liabilities to your project: (1) The Storyboard Editor tool that generates the storyboard XML and (2) the runtime component that parses the XML and creates UI and controller objects from it. Both parts can have bugs that you can't fix.

  • Storyboards don't allow you to add a subview to a UIImageView: Who knows why.

  • Storyboards don't allow you to enable Auto Layout for individual View(-Controller)s: By checking/unchecking the Auto Layout option in a Storyboard, the change is applied to ALL controllers in the Storyboard. (Thanks to Sava Mazăre for this point!)

  • Storyboards have a higher risk of breaking backwards compatibility: Xcode sometimes changes the Storyboard file format and doesn't guarantee in any way that you will be able to open Storyboard files that you create today a few years or even months from now. (Thanks to thoughtadvances for this point. See the original comment)

  • Storyboards can make your code more complex: When you create your view controllers in code, you can create custom init methods, for example initWithCustomer:. That way, you can make the customer inside of your view controller immutable and make sure that this view controller cannot be created without a customer object. This is not possible when using Storyboards. You will have to wait for the prepareForSegue:sender: method to be called and then you will have to set the customer property on your view controller, which means you have to make this property mutable and you will have to allow for the view controller to be created without a customer object. In my experience this can greatly complicate your code and makes it harder to reason about the flow of your app. Update 9/9/16: Chris Dzombak wrote a great article about this problem.

  • It's McDonald's: To say it in Steve Jobs' words about Microsoft: It's McDonald's (video)!

These are my reasons for why I really don't like working with storyboards. Some of these reasons also apply to XIBs. On the storyboard-based projects that I've worked on, they have cost me much more time than they have saved and they made things more complicated instead of easier.

When I create my UI and application flow in code, I am much more in control of what is going on, it is easier to debug, it is easier to spot mistakes early on, it is easier to explain my changes to other developers and it is easier to support iPhone and iPad.

However, I do agree that laying out all of your UI in code might not be a one-size-fits-all solution for every project. If your iPad UI differs greatly from your iPhone UI in certain places, it might make sense to create a XIB for just those areas.

A lot of the problems outlined above could be fixed by Apple and I hope that that's what they will do.

Just my two cents.

Update: In Xcode 5, Apple took away the option to create a project without a Storyboard. I've written a small script that ports Xcode 4's templates (with Storyboard-opt-out option) to Xcode 5: https://github.com/jfahrenkrug/Xcode4templates

Dogie answered 18/10, 2013 at 19:5 Comment(15)
Not a fan of story boards, eh? :)Nonstandard
@Nonstandard Haha, no, not really. After working on iOS projects with and without storyboards I came to the conclusion that I really don't like them :)Dogie
I would agree that there are many things that should be improved in StoryBoards, but this is the paleo argument. Clearly, after you've laid out all your reasons, the way your post really reads is 'there are no amount of improvements that will ever make me think there's a better way to build apps than me hand-writing all the ui code.'Roxanneroxburgh
@Roxanneroxburgh While it might sound like I think that, I actually don't. I can imagine many ways in which laying out UI can be done in a better way than hand-writing it all in code. I think my biggest criticism about Storyboards is their implementation rather than the idea behind them. Most of the points that I outline could be fixed with better tools and a better implementation (one that lets a human track and understand changes, for example). When they improve to the point that the benefits outweigh the drawbacks, I'd gladly give them another chance and change my opinion. But that day is not today :)Dogie
@JohannesFahrenkrug I would certainly say I agree with that line of reasoning. The arguments that they are slow and merges are a nightmare are outdated. Those things have been fixed. For sure, if you know what you are doing, you can push much farther into the woods much faster using IB. A split screen between someone using StoryBoards vs. hand coding to get a simple app with say 10 screens in it going would be pretty comical.Roxanneroxburgh
@Roxanneroxburgh Yes, I never complained about them being slow. Merging has become better, but if two developers work in the same area of the storyboard, it is difficult to impossible to resolve merge conflicts: The Storyboard XML is just not designed to be human-editable. You are absolutely right that "a simple app with say 10 screens" can be done faster with Storyboards than in code, I don't argue that. However, only very few apps are that simple or stay that simple. As outlined above, imho you lose a lot of time using Storyboards when your app grows and gets more complex.Dogie
@JohannesFahrenkrug, I totally agree with you.Suh
Sad but true! Totally agree! +1 for the McDonald's :)Pin
Great! Add also: in storyboards you cannot enable/disable AUTO LAYOUT just for a single controller - by checking/unchecking the auto layout, the change is applied for ALL and ANY controllers you have in the storyboard. This is what I hate the most.Sherbrooke
@SavaMazăre Thank you! Great point! I've added it to the post!Dogie
I would add to this list that Interface Builder files are less future-proof. I've opened old (iOS 5 era) .xib and .storyboard files into a modern (iOS 7 era) Xcode and attempted to update it's appearance. The Interface Builder files are typically broken when moving across screen sizes and iOS versions with large visual changes (ex. iOS 6 to 7). These visual updates would have occurred without many weird artifacts and mindless storyboard recreations if the UI had simply been created in code.Dowsabel
Thanks for this answer and I agree with you ! I'm new to iOS and I'm not a huge fan of storyboard I use it because I don't know much of iOS UI development. The idea behind is pretty good and can be (for newbies like me) an easiest way to develop apps faster. BTW I'm curious to know which are the good practices to follow if I need to start using code instead of storyboard ?Symptom
Not sure if mentioned before in this answer but I get the impression that more and more features in IB are only available with storyboards and they are just not available at all with xibs, like the hugely useful collection/table view cell prototypes.Dremadremann
"Update 1/12/2016: It's 2016 and I still prefer laying out my UIs in code and not in Storyboards." Did you worked in team of more than 2-3 developer or you were just only developer to develop app. I guess decision for choosing any UI rendering approach has teams size factor as well.Waiwaif
@iNasir Good question. I was working in a team. But even if I would not have worked in a team, I would have preferred to not use Storyboards (and still do). I am looking forward to using Xcode 9 and seeing how handling Storyboards has improved. Xcode 9 looks great so far! I'll talk to some engineers here at WWDC to find out more.Dogie
V
176

I have used XIBs extensively and completed two projects using Storyboards. My learnings are:

  • Storyboards are nice for apps with a small to medium number of screens and relatively straightforward navigation between views.
  • If you have lots of views and lots of cross-navigation between them the Storyboard view gets confusing and too much work to keep clean.
  • For a large project with multiple developers I would not use Storyboards because you have a single file for your UI and cannot easily work in parallel.
  • It might be worth for large apps to split up into multiple storyboard files but I have not tried that. This answer shows how to do segues between storyboards.
  • You still need XIBs: In both of my Storyboard projects I had to use XIBs for custom table cells.

I think Storyboards are a step in the right direction for UI implementation and hope Apple will extend them in future iOS versions. They need to resolve the "single file" issue though, otherwise they won't be attractive for larger projects.

If I start a small size app and can afford iOS5 only compatibility, I would use Storyboards. For all other cases I stick to XIBs.

Virtuoso answered 1/5, 2012 at 16:32 Comment(7)
Two things. 1) You can make custom table cells (they call them prototype cells) in storyboards and 2) You can use multiple storyboard files. See my answer here: https://mcmap.net/q/129587/-segue-to-another-storyboard for details how.Lewin
Thanks. I added the link to your answer. As for the custom cells: Prototype cells did not work for me because I need to reuse custom cells across multiple views. So I had to revert to XIBs.Virtuoso
Merging storyboards has been significantly improved in Xcode 5.x as the XML markup has been greatly simplified.Buy
I think it all depends on the project morphology (prototype?,large scale project?, already designed?, etc...) Here are my thoughts polarios.co/2014/08/04/storyboard-xibs-coOrna
"If you have lots of views and lots of cross-navigation between them the Storyboard view gets confusing and too much work to keep clean" I don't agree on that, you just need to figure out proper flow to do it, you can avoid most of the segues with a proper design.Equip
Creating custom cells in storyboard is not a good idea @lnafziger, it is a mess and you usually use the cell in many situations. However, you should use multiple storyboards depending on the flow. Storyboards are the future if we talk about view controllers, otherwise it is not necessary and useful.Pipistrelle
@Virtuoso You mentioned that you use xibs for table view cells that are used in multiple view controllers. How do you set this up? Specifically the file's owner and class. I would really appreciate any help, I haven't found any clear way of doing this.Tears
J
17

Storyboards were created to help developers visualize their application and the flow of the application. It is alot like having a bunch of xib but in a single file.

There is a question similar to this located What is the difference between a .xib file and a .storyboard?.

You can also create custom transitions via code that will change dynamically if needed, much like you can with .xibs.

PROS:

  • You can mock up flow of an application without writing much, if any code.
  • Much easier to see your transitions between screens and your application flow.
  • Can also use .xibs if needed with storyboards.

CONS:

  • Only works with iOS 5+. Does not work with iOS4.
  • Can get cluttered easily if you have a very view intensive application.

There really isn't a right / wrong when to use one or the other, it is just a matter of preference and what iOS versions you are wanting to use.

Jackdaw answered 22/2, 2012 at 22:58 Comment(1)
I know the difference between them and how they work I'm looking for information on when to use one, the other or when to use both.Canady
G
13

I will just state 4 simple reasons why you should use storyboards, especially in a productive environment where you have to work in a team of product owners, product managers, UX designers, etc.

  1. Apple has GREATLY improved working with Storyboards. And they encourage you to work with them. Which means they will not break your existing projects with updates, they will ensure that storyboards are future proof for newer XCode/iOS versions.
  2. More visible results in less time for the product owners and managers, even during the creation phase. You can even use the storyboard itself as a screenflow diagram and discuss it in meetings.
  3. Even after an app is done (and that's generally where its life-cycle begins) – in the future it will be faster and easier to apply small adjustments. And these could very well change multiple aspects of your layout at the same time, which you probably want to see in a WYSIWYG manner. The alternative would be hand-writing UI changes in code and switching back and forth between the IDE and the simulator to test it out, each time waiting for compile & build.
  4. Non-developers can be taught to set up layouts in storyboards and create the necessary hooks for the developers (IBOutlets and IBActions). That's a very big plus because it lets the devs focus on the logic and the UX designers apply their changes in a visual manner, without having to write any code at all.

I won't write up any CONS, since Johannes has already listed probably all the viable ones in his answer. And most of them are definitely not viable, especially not with XCode6's major improvements.

Googins answered 27/11, 2014 at 10:20 Comment(1)
a fan of story boards, eh ? :)Vulpine
E
5

I don't think there is a right answer for your question, it's just a matter of personal experience and what you feel more confortable with.

In my opinion, Storyboards are a great thing. It's true, it's really hard to find out why your app is misteriously crashing at runtime, but after some time and experience you'll realize it's always related to some IBOutlet missing somewhere and you'll be easily able to fix it.

The only real issue is working in team under version control with storyboards, in the early stages of development it could be a real mess. But after that first stage, UI updates that completely changes the storyboard are very rare, and in most cases you end up with conflicts in the very last parts of the xml, which are segue references that usually autofix themselves when you re-open the storyboard. In our team work we prefered to deal with this instead of heavy view-controllers with tons of view code.

I've read many comments againts auto-layout. With XCode5 it got really improved, It's really good even for autorotating layouts. In some case you'll have to do something in code, but you can simply outlet the constraint you need to edit and, at that point, do what you need in your code. Even animate them.

I also think that most of the people who dislike storyboards didn't fully try to understand the power of a custom manual segue, where you can totally customize (in a single file) the way you transition from a way to another and also (with some tricks) even reuse a previously loaded view controller by just updating it's view contents instead of fully reload the whole thing. At the end you can really do the same things as in code, but I think you have a better separation of concerns with storyboards, but I agree that in many things they lack of features (fonts, image as color background, ecc...).

Espalier answered 15/2, 2014 at 10:6 Comment(3)
Actually after working with XCode and Storyboards I can only tell that it is a nightmare, and for ALL of you defending it and saying about it as "great thing" I say: You haven't seen great thing so far (it's like a hill is a mountain for a folks who haven't been in mountains). Closer to greatness is what is available in android; xml's that are human readable with visual editor helps you a lot, and it is not even "great thing", just something that any normal developer would EXPECT as base of functionality.Demotic
I totally disagree with you, I've been an Android developer before switching to iOS, I would always choose Storyboards over XML Layouts. It's a great thing for many cases (not ALL scenarios, but works for most of them) and I prefer it to a bunch of code in view controllers which is surely less immediate. At the end, it's just a matter of opinions and scenarios.Espalier
why on earth do I need to use a storyboard if I am using Angular UI router?Idola
S
0

I am not using StoryBoard or XIBs in my any of the app.. but creating everything programmatically.

∆ Benefits :

√ You can create any complex kind of UI or transition animations for UIView's.

√ Support all iOS versions. No need to worry about < iOS 5.

√ *Your app would support all iPhone/iPod/iPad devices within your code.

√ You're always updated as you know the code that'll always work.

√ *Will work on any (new) device launched – No need to change in code.

√ Everything is upto you. At certain place you want to change something – No need to look into storyboard or xib. Just search for it in particular class.

√ Last but not the list – You'll never forget that, how to manage everything programmatically. This is the best thing as you know a control very deep then anyone.

I've never find a problem by not using SB or XIBs as I'm good with this.

* if you've set UIKit's object frames according to screen size.

P.S. If you've still not done this thing – you may faced difficulty (or may feel boring) but once you get familiar with this – its really a Candy for you.

Sandblast answered 7/8, 2015 at 11:7 Comment(1)
Where might one find a Swift template/example for a basic "creating everything programmatically" iOS & OSX applications without any Storyboard or XIB?Planksheer
G
0

If you are about to care about Storyboard performance, watch WWDC 2015 Session 407

enter image description here

Build Time

When interface builder is compiling a storyboard it's doing two things first, it's trying to maximize the performance of your application and secondly it's also minimizing the number of nib files created.

If I have a view controller with a view and a bunch of sub views, interface builder, the build time is going to create a nib file for the view controller and create a nib file for the view.

By having separate nib files for both the view controller and the view, this means the view hierarchy can be loaded on demand.

Run Time

When you allocate a storyboard instance using UI storyboard, API, initially all you are allocating memory for is the UI storyboard instance itself.

No view controllers no views yet.

When you instantiate your initial view controller it will load the nib for that initial view controller but, again, no view hierarchy has been loaded yet until someone actually asks for it.

Granivorous answered 11/8, 2015 at 18:22 Comment(0)
F
0

I have been working on a reasonably sized project (>20 scenes in storyboard parlance), and have come across many limitations and have to repeatedly go to documentation and google searches for doing things.

  1. The UI is all in one file. Even if you create multiple storyboards, you still have many scenes/screens in each storyboard. This is a problem in medium-large teams.

  2. Secondly, they do not play well with custom Container Controllers which embed other container controllers etc. We're using MFSlideMenu in a Tabbed application and the scene has a table. This is almost impossible to do with a storyboard. Having spent days, I've resorted to doing the XIB way where there is complete control.

  3. The IDE does not allow to select controls in zoomed-out state. So, in a large project, the zoom-out is mostly to get a high level view and nothing more.

I would use storyboards for smaller applications with small team sizes and use XIB approach for medium-large teams/projects.

Fabricate answered 18/11, 2015 at 12:2 Comment(1)
These three points are now totally out of date (thank goodness).Vassallo
A
0

If you want to reuse some UI in multiple view controllers then you should use XIBs

Adamik answered 5/11, 2018 at 5:41 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.