2013-03-03 5 views
0

У меня есть продукт iOS, в котором есть несколько различных SKU, каждый из которых должен начинаться с другого контроллера вида. У меня есть разные SKU, разделенные Targets, что позволяет мне указать препроцессоры, необходимые для этой версии продукта.Можно ли изменить «начальный контроллер представления» на основе Target?

Единственное, что я хотел бы сделать, однако, это изменить значение «начальное представление контроллера» в раскадровке, чтобы создать различные SKU без необходимости вручную включать или выключать окно в зависимости от по тому, что я строю.

Итак, мой вопрос: может ли это быть сделано цели или программно (так что я могу сделать это, используя #ifdef с конкретными препроцессорами SKU)?

Заранее благодарен!

ответ

3

Вы должны сделать это в коде, используя идентификаторы, назначенные в раскадровке. Вы можете создать файл заголовка целевой четкости или сделать #ifdef с при начале вашего AppDelegate.m:

#ifdef TARGET_FOO 
#define INITIAL_VC_ID @"FOO_ID" 
[...] 

, а затем в вы можете сделать ваше приложение делегата application:didFinishLaunchingWithOptions::

UIWindow *window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 
self.window = window; 

UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:[NSBundle mainBundle]]; 

[window setRootViewController:[mainStoryboard instantiateViewControllerWithIdentifier:INITIAL_VC_ID]]; 

[window makeKeyAndVisible]; 

return YES; 

это требует чтобы удалить ссылку «Main storybaord» из Info.plist проекта, поэтому UIKit не будет загружать ее по умолчанию.

+0

Спасибо Мартину, это прекрасно работает. Единственное отличие заключается в том, что я использовал препроцессор, определенный в настройках Target (то есть INITIAL = "@ \" Initial_Target1 \ "") и передал определение непосредственно в 'instantiateViewControllerWithIdentifier'). –

+1

Быстрое добавление ... Для всех, кто это видит. Я бы посоветовал сделать это на ** конце ** «application: didFinishLaunchingWithOptions:», если вы выполняете какую-либо обработку там, которая инициализирует начальное представление, так как иначе 'viewDidLoad' вызывается перед' application: doneFinishLaunchingWithOptions: 'exit , –

+0

Я обычно создаю что-то вроде класса «менеджер презентаций», который я установил, и вызываю 'setupWindow:' on. этот менеджер тогда знает о ссылках на все раскадровки (Main.storyboard, Login.storyboard, ..) и необходимые идентификаторы (например, 'presentLoginWithCompletionHandler:') –

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