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从未考虑过.
我该怎么做才能解决这个问题?
您需要运行时检查,而不是使用编译时检查.这意味着你无法使用#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)
这可以确保调用初始化程序,并在代码中的任何其他位置使用它们之前设置常量.
您可以通过将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)
| 归档时间: |
|
| 查看次数: |
11886 次 |
| 最近记录: |