2013-04-30 3 views
2

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

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

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

Я посмотрел на несколько смежный вопрос: 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) 

ответ

2

Возможно, было бы проще использовать 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); 

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

+0

Раскадровка достаточно уже занята, то это означало бы удвоение его размера. Кроме того, мне все равно придется иметь тот же код, что и выше, с теми же проблемами. Так что, действительно, нет никакой выгоды от этого предложения. –

+0

Почему вы не можете изменить цвета из кода? Использование UIAppearrance было бы намного лучшим кандидатом для этого, чем внесение изменений в раскадровки. – jonathanpeppers

+0

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

Смежные вопросы