3

Constants.hアプリ内にファイルがあり、#define後で簡単にアクセスできるようにアプリ全体のファイルがあります。私は苦労していますが、#defineiOSのバージョンに基づいています。これが私が試したことです:

#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です。

これを修正するにはどうすればよいですか?

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 に答える
2

#ifdef の代わりに #ifndef を使用する必要があります。ここにコードがあります。お役に立てば幸いです。

#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 に答える