如何#define基于iOS版本?

Und*_*ndo 3 objective-c ifdefine ios c-preprocessor

Constants.h我的应用程序中有一个文件,我可以在#define应用程序范围内轻松访问.不过,#define基于iOS版本,我很难过.这是我尝试过的:

#ifdef __IPHONE_7_0

#define kHamburgerImage [UIImage imageNamed:@"reveal_menu_icon_portrait_ios7.png"];

#else

#define kHamburgerImage [UIImage imageNamed:@"reveal_menu_icon_portrait.png"];

#endif
Run Code Online (Sandbox Code Playgroud)

仅仅因为它说iOS 7并不意味着这是在NDA下,O闭门器!

哪个适用于iOS 7.然而,当我在iOS 6上运行我的应用程序时,#define它仍然是iOS 7 - 似乎#ifdef从未考虑过.

我该怎么做才能解决这个问题?

rma*_*ddy 7

您需要运行时检查,而不是使用编译时检查.这意味着你无法使用#define.我建议使用一个基于iOS版本在运行时初始化的静态变量.如果您只需要单个文件中的值,则下面是一个示例.

一些.m文件:

static UIImage *kHamburgerImage = nil;

+ (void)initialize {
    // This assumes you only support iOS 6 and later - adjust as needed
    if ([[UIDevice currentDevice].systemVersion hasPrefix:@"6"]) {
        kHamburgerImage = [UIImage imageNamed:@"reveal_menu_icon_portrait.png"];
    } else {
        kHamburgerImage = [UIImage imageNamed:@"reveal_menu_icon_portrait_ios7.png"];
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑:由于这些必须是全局变量,你应该这样做:

Constants.h:

extern UIImage *kHamburgerImage;

@interface Constants
@end
Run Code Online (Sandbox Code Playgroud)

Constants.m:

UIImage *kHamburgerImage = nil;

@implementation Constants

+ (void)initialize {
    // This assumes you only support iOS 6 and later - adjust as needed
    if ([[UIDevice currentDevice].systemVersion hasPrefix:@"6"]) {
        kHamburgerImage = [UIImage imageNamed:@"reveal_menu_icon_portrait.png"];
    } else {
        kHamburgerImage = [UIImage imageNamed:@"reveal_menu_icon_portrait_ios7.png"];
    }
}

@end
Run Code Online (Sandbox Code Playgroud)

但这有一个问题.除非您采取特定步骤,否则访问这些全局变量可能会产生nil指针.如果实际引用了类,它们只会被初始化.我建议application:didFinishLaunchingWithOptions:你做第一行:

[Constants class];
Run Code Online (Sandbox Code Playgroud)

这可以确保调用初始化程序,并在代码中的任何其他位置使用它们之前设置常量.


Joh*_*eck 6

您可以通过将iOS检查定义为宏来至少缩短代码.

#define IS_IOS7 [[UIDevice currentDevice].systemVersion hasPrefix:@"7"]
Run Code Online (Sandbox Code Playgroud)

然后你的新代码更具可读性

if (IS_IOS7) {
    kHamburgerImage = [UIImage imageNamed:@"reveal_menu_icon_portrait_ios7.png"];
} else {
    kHamburgerImage = [UIImage imageNamed:@"reveal_menu_icon_portrait.png"];
}
Run Code Online (Sandbox Code Playgroud)

  • 它确实有效!它只是在编译时用以下代码替换IS_IOS7.它产生了本来不可读的代码. (2认同)