2013-03-03 57 views
0

我有一个iOS产品,有几个不同的SKU,每个SKU都应该以不同的视图控制器开始。我有不同的SKU由目标分开,这使我可以指定该版本产品所需的预处理器。是否有可能根据Target更改'初始视图控制器'?

然而,我希望能够做的一件事就是改变故事板中的'初始视图控制器'值,以便构建不同的SKU,而无需手动检查框的开启或关闭。关于我正在建造的东西。

所以我的问题是,这可以通过目标,或以编程方式完成(所以我可以使用#ifdef与特定的SKU预处理器)?

在此先感谢!

回答

3

您必须使用故事板中分配的标识符在代码中执行此操作。你可以创建一个目标定义头文件或在您AppDelegate.m的开始做#ifdef S:

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

这需要你从项目的Info.plist中删除任何“主要故事情节”参考,因此UIKit默认不会加载它。

+0

谢谢马丁,这个作品完美。唯一的区别是我使用了在目标设置中定义的预处理器(即INITIAL =“@ \”Initial_Target1 \“”),并将定义直接传递给'instantiateViewControllerWithIdentifier'。 – 2013-03-03 23:54:03

+1

快速附录......对于任何看到这个的人。我建议在'application:didFinishLaunchingWithOptions:'的** end **这样做,如果你在那里做任何初始化初始视图的处理,否则'viewDidLoad'在'application:didFinishLaunchingWithOptions:'出口之前被调用。 – 2013-03-03 23:56:25

+0

我通常会创建一个类似于'演示文稿管理器'的类,我设置并调用'setupWindow:'。这位经理知道一个保持对所有故事板(Main.storyboard,Login.storyboard,..)和所需标识符的引用(例如'presentLoginWithCompletionHandler:') – 2013-03-04 00:08:29

相关问题