【问题标题】:Detect which target was compiled using precompiler macro检测使用预编译器宏编译的目标
【发布时间】:2014-02-13 03:48:41
【问题描述】:

我正在使用 Xcode 5 并尝试制作我的应用程序的精简版和付费版。我复制了目标并将预编译器宏设置为 IS_PRO =1 和 IS_LITE =1。然后我在我的 App Delegate 中添加了以下代码。

if (self.window.frame.size.height == 568)
        {
            #ifdef IS_PRO

                UIStoryboard *storyBoard = [UIStoryboard storyboardWithName:@"iPhone5" bundle:nil];

                UIViewController *viewController = [storyBoard instantiateViewControllerWithIdentifier:@"iPhone5"];

                self.window.rootViewController = viewController;
                [self.window makeKeyAndVisible];

                return YES;

            #else

            UIStoryboard *storyBoard = [UIStoryboard storyboardWithName:@"iPhone5 Lite" bundle:nil];

            UIViewController *viewController = [storyBoard instantiateViewControllerWithIdentifier:@"iPhone5 Lite"];

            self.window.rootViewController = viewController;
            [self.window makeKeyAndVisible];

            return YES;

            #endif

        }
        else
        {
            #ifdef IS_PRO

            UIStoryboard *storyBoard = [UIStoryboard storyboardWithName:@"iPhone3.5" bundle:nil];

            UIViewController *viewController = [storyBoard instantiateViewControllerWithIdentifier:@"iPhone3.5"];

            self.window.rootViewController = viewController;
            [self.window makeKeyAndVisible];

            return YES;

            #else

            UIStoryboard *storyBoard = [UIStoryboard storyboardWithName:@"iPhone3.5 Lite" bundle:nil];

            UIViewController *viewController = [storyBoard instantiateViewControllerWithIdentifier:@"iPhone3.5 Lite"];

            self.window.rootViewController = viewController;
            [self.window makeKeyAndVisible];

            return YES;

            #endif
        }

但是,唯一有效的是#ifdef 和#else 之间的代码。 #else 和 #endif 之间的代码是白色的(不像 Xcode 接受代码时那样通常是多色的)。如果我删除预编译器宏并且仅尝试检测屏幕尺寸,则此代码可以完美运行。

我还做了一个不相关的快速测试,看看我是否可以让以下工作:

#ifdef IS_LITE
    NSLog(@"LITE VERSION");
#else
    NSLog(@"PRO VERSION");
#endif

我得到了同样的结果。 Xcode 只会读取#ifdef 和#else 之间的代码,#else 和#endif 之间的代码是白色的。有人可以帮帮我吗?!?

【问题讨论】:

  • 不清楚你做了什么。确保只在每个目标中定义一个宏。 “pro”目标应该只定义IS_PRO,“lite”版本应该只定义IS_LITE

标签: ios


【解决方案1】:

必须为每个目标定义预处理宏

Target-->构建设置--> 预处理器宏。

当您构建特定目标时,特定代码将被编译。

【讨论】:

    【解决方案2】:

    如果定义了宏,#ifdef 始终为真。它的值是0还是1。

    它将像这样工作:

    #if(IS_LITE)
        NSLog(@"LITE VERSION");
    #else
        NSLog(@"PRO VERSION");
    #endif
    

    【讨论】:

    • 这应该是#if(IS_LITE)。根据问题,没有名为LITE_VERSION的宏。
    • 是的,它是 IS_LITE ,而不是 LITE_VERSION。我原来的帖子有错字。现在已更正。但是,当我键入上面的简单 NSLog 示例时,Xcode 只能识别 #if(IS_LITE) 和 #else 之间的代码。 #else 和 #endif 之间的代码是白色的,这让我相信它没有被识别。
    • 好吧,我重新复制了目标并再次设置了预处理器编译器代码,但由于某种原因它开始工作了……这次我没有重命名新的目标方案或 info.plist,所以也许有一些东西跟它有什么关系??无论如何,感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-06
    • 2010-11-17
    • 1970-01-01
    • 2011-04-05
    • 1970-01-01
    相关资源
    最近更新 更多