【问题标题】:Is it possible to change 'is initial view controller' based upon Target?是否可以根据 Target 更改“初始视图控制器”?
【发布时间】:2013-03-03 21:32:56
【问题描述】:

我有一个 iOS 产品,它有几个不同的 SKU,每个 SKU 都应该以不同的视图控制器开头。我有由 Targets 分隔的不同 SKU,这使我可以指定该产品版本所需的预处理器。

但是,我希望能够做的一件事是更改情节提要中的“初始视图控制器”值,以便构建不同的 SKU,而无需手动打开或关闭该框,具体取决于我正在建造什么。

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

提前致谢!

【问题讨论】:

    标签: ios xcode storyboard


    【解决方案1】:

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

    #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 默认不会加载它。

    【讨论】:

    • 谢谢马丁,这很好用。唯一的区别是我使用了在 Target 设置中定义的预处理器(即 INITIAL="@\"Initial_Target1\"")并将定义直接传递给 instantiateViewControllerWithIdentifier)。
    • 快速附录...对于其他看到的人。我建议在application:didFinishLaunchingWithOptions:end 处执行此操作,如果您在那里进行初始化初始视图的任何处理,否则在application:didFinishLaunchingWithOptions: 退出之前调用viewDidLoad。跨度>
    • 我通常会创建类似“演示管理器”类的东西,我会设置并调用setupWindow:。然后,该经理知道对所有故事板(Main.storyboard、Login.storyboard、..)和所需标识符的引用..(例如presentLoginWithCompletionHandler:
    猜你喜欢
    • 1970-01-01
    • 2017-11-17
    • 2017-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-26
    相关资源
    最近更新 更多