支持两个故事板

时间:2013-04-30 21:17:09

标签: xamarin.ios storyboard xamarin xcode-storyboard

我有一个带有中型故事板的应用程序,这个应用程序非常复杂,我不想过多地使用它。

我想复制这个故事板并更改配色方案,让用户选择要使用的配色方案。

我的问题是:我可以以编程方式选择在启动时默认使用哪个故事板吗?如果是的话 - 我该怎么做?

我查看了一个有点相关的问题:Storyboards Orientation Support in Xcode 4.5 and iOS 6.x ?

根据该代码,我制作了一个扩展方法:

   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;
   }
}

然后我在ViewDidAppear覆盖:

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

此代码在某些情况下有效,但在其他情况下,在执行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)

1 个答案:

答案 0 :(得分:2)

使用1个Storyboard并在同一个故事板中拥有2组控制器可能更简单。只需为控制器使用不同的故事板ID。如果需要,您可以使用相同的类。

例如:

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

两者都可以创建MyController的实例,但从同一个storyboard文件中提取不同的布局。

另一种选择是使用UIAppearance动态设置应用中某种类型的所有控件的“样式”。

例如,要在整个应用中设置默认的UIBarButtonItem图片:

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

(你可以在那里查看我的参数)