Как # определить на основе версии iOS?
У меня есть 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, о, доводчики!
Что отлично работает - для iOS 7. Однако когда я запускаю свое приложение на iOS 6, #define
все еще iOS 7 - кажется, что #ifdef
никогда не принимается во внимание
Что я могу сделать, чтобы это исправить?
3 ответа
Вместо использования проверок во время компиляции вам нужны проверки во время выполнения. Это означает, что вы не можете использовать #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"];
}
}
Изменить: так как они должны быть глобальными, вы должны сделать это:
Constants.h:
extern UIImage *kHamburgerImage;
@interface Constants
@end
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
Но это страдает от проблемы. Если вы не предпримете конкретные шаги, доступ к этим глобальным nil
указатели. Они инициализируются только в том случае, если на класс есть реальная ссылка. Я предлагаю это в качестве первой строки вашего application:didFinishLaunchingWithOptions:
ты сделаешь:
[Constants class];
Это гарантирует, что инициализатор вызывается и константы устанавливаются перед тем, как использовать их где-либо еще в вашем коде.
Вы можете по крайней мере сократить свой код, определив проверку 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"];
}
Вы должны использовать #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