Как # определить на основе версии 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
Другие вопросы по тегам