Sten Petrov
Sten Petrov

Reputation: 11040

Supporting two storyboards

I have an app with a medium-sized storyboard, which is complicated enough for me not to want to mess around with it too much.

I want to copy this storyboard and change the color scheme and let the user select which color scheme to use.

My question is: can I programmatically select which storyboard will be used by default on startup? If yes - how do I do that?

I looked at a somewhat related question: Storyboards Orientation Support in Xcode 4.5 and iOS 6.x ?

Based on that code I made an extension method:

   static bool IsStoryboardLoading {get;set;}

   public static T ConsiderSwitchingStoryboard<T> (this UIViewController from) where T: UIViewController
   {
       if (!IsStoryboardLoading && LocalStorage.Instance.IsWhiteScheme && false) {
           try {
               IsStoryboardLoading = true; 
               UIStoryboard storyboard = UIStoryboard.FromName ("MainStoryboard_WHITE", NSBundle.MainBundle);
               T whiteView = storyboard.InstantiateViewController (typeof(T).Name) as T;

               from.PresentViewController (whiteView, false, null); 
               return whiteView;
           } finally {
               IsStoryboardLoading = false; 
           }  
       } 
       return null;
   }
}

and then I use it in ViewDidAppear override:

public override void ViewDidAppear (bool animated)
{
    this.ConsiderSwitchingStoryboard<MyViewController> ();
}

This code works in some cases but in others it causes an error when performing a push segue:

NSGenericException Reason: Could not find a navigation controller for segue 'segSearchResults'. Push segues can only be used when the source controller is managed by an instance of UINavigationController.
  at (wrapper managed-to-native) MonoTouch.ObjCRuntime.Messaging:void_objc_msgSendSuper_IntPtr_IntPtr (intptr,intptr,intptr,intptr)

Upvotes: 2

Views: 1092

Answers (1)

jonathanpeppers
jonathanpeppers

Reputation: 26495

It might be simpler to just use 1 Storyboard and have 2 sets of controllers in the same storyboard. Just use different storyboard ids for the controllers. You can use the same class on those if needed.

For example:

var whiteController = Storyboard.InstantiateViewController("MyWhiteController") as MyController;
var blueController = Storyboard.InstantiateViewController("MyBlueController") as MyController;

Both could create an instance of MyController, but pull out different layouts from the same storyboard file.

Another option is to use UIAppearance to dynamically set a "style" on all controls of a certain type in your app.

For example, to set the default UIBarButtonItem image throughout your app:

UIBarButtonItem.Appearance.SetBackgroundImage(UIImage.FromFile("yourpng.png"), UIControlState.Normal, UIBarMetrics.Detault);

(You might check my parameters there)

Upvotes: 2

Related Questions