3

我的应用程序中有一个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

仅仅因为上面写着 iOS 7 并不意味着这是在 NDA 之下,O 更接近了!

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

我能做些什么来解决这个问题?

4

3 回答 3

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"];
    }
}

编辑:因为这些需要是全局的,你应该这样做:

常量.h:

extern UIImage *kHamburgerImage;

@interface Constants
@end

常数.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

但这有一个问题。除非您采取特定步骤,否则访问这些全局变量可能会导致nil指针。只有当类被实际引用时,它们才会被初始化。我建议作为你的第一行application:didFinishLaunchingWithOptions:

[Constants class];

这可以确保调用初始化程序并设置常量,然后再在代码中的其他任何地方使用它们。

于 2013-07-24T23:38:34.953 回答
6

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

#define IS_IOS7 [[UIDevice currentDevice].systemVersion hasPrefix:@"7"]

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

if (IS_IOS7) {
    kHamburgerImage = [UIImage imageNamed:@"reveal_menu_icon_portrait_ios7.png"];
} else {
    kHamburgerImage = [UIImage imageNamed:@"reveal_menu_icon_portrait.png"];
}
于 2013-09-30T16:59:54.290 回答
2

您应该使用#ifndef 而不是#ifdef。这是代码。我希望它会帮助你。

#ifndef __IPHONE_7_0

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

#else

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

#endif
于 2013-12-27T07:40:34.653 回答