Поддержка двух раскадровок

У меня есть приложение с раскадровкой среднего размера, которая достаточно сложна, чтобы я не хотел слишком много возиться с ней.

Я хочу скопировать эту раскадровку и изменить цветовую схему, чтобы пользователь мог выбрать, какую цветовую схему использовать.

Мой вопрос: могу ли я программно выбрать, какая раскадровка будет использоваться по умолчанию при запуске? Если да - как мне это сделать?

Я рассмотрел несколько связанный вопрос: Ориентация раскадровки Поддержка в Xcode 4.5 и 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:

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)

person Sten Petrov    schedule 30.04.2013    source источник


Ответы (1)


Может быть проще просто использовать 1 раскадровку и иметь 2 набора контроллеров в одной и той же раскадровке. Просто используйте разные идентификаторы раскадровки для контроллеров. Вы можете использовать один и тот же класс для них, если это необходимо.

Например:

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

Оба могут создать экземпляр MyController, но извлекать разные макеты из одного и того же файла раскадровки.

Другой вариант — использовать UIAppearance для динамической установки «стиля» для всех элементов управления определенного типа в вашем приложении.

Например, чтобы установить изображение UIBarButtonItem по умолчанию во всем приложении:

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

(Вы можете проверить мои параметры там)

person jonathanpeppers    schedule 01.05.2013
comment
Раскадровка уже достаточно занята, это означало бы удвоение ее размера. Кроме того, мне все равно придется иметь тот же код, что и выше, с теми же проблемами. Так что на самом деле в этом предложении нет никакой пользы. - person Sten Petrov; 02.05.2013
comment
Почему тогда вы не можете изменить цвета из кода? Использование UIAppearrance было бы гораздо лучшим кандидатом для этого, чем внесение изменений в раскадровки. - person jonathanpeppers; 02.05.2013
comment
Я могу, но я бы предпочел создать XSD, чтобы преобразовать мою основную раскадровку во вторую с измененными цветами при сборке, и мне не нужно писать код для каждого элемента, который необходимо изменить. - person Sten Petrov; 02.05.2013
comment
Это похоже на эквивалентный объем работы, UIAppearance является более стандартным решением и будет более очевидным для других разработчиков Xamarin.iOS. Позже сегодня я внесу изменения в то, как вы можете заставить это работать, поскольку это уже звучит так, как будто вы настраиваете XSD. - person jonathanpeppers; 02.05.2013
comment
Я еще не настроил XSD. Я ищу способ, который был бы эквивалентен редактированию info.plist для замены раскадровки по умолчанию - чем меньше задействовано кода и чем меньше он распространяется по всему моему другому коду - тем лучше. - person Sten Petrov; 02.05.2013
comment
UIAppearance будет состоять всего из нескольких строк C#, это эквивалент CSS для iOS. - person jonathanpeppers; 03.05.2013
comment
Я посмотрел его, и я вижу, что он делает, он, вероятно, будет работать для того, что мне нужно. Пожалуйста, обновите свой ответ небольшим образцом, чтобы я мог пометить его как ответ. Спасибо много! - person Sten Petrov; 03.05.2013