4

我有一个源文件来放置我的所有常量(constant.h),如下所示:

#define MY_URL @"url"
#define SECOND_URL @"url2"
...

我的问题是用这样的条件声明一个常数:

if (ipad)
   #define MY_CONSTANT @"ipad"
else
   #define MY_CONSTANT @"iphone"

请问我该怎么做并将其放入constant.h

4

2 回答 2

6

如果您同时支持 ipad 和 iphone,则直到运行时才知道设备。

如果您使用常量标头,那么您可以按如下方式处理设备特定定义:

常量.h

NSString * MON_CONSTANT();

常数.m

NSString * MON_CONSTANT() {
  switch (UI_USER_INTERFACE_IDIOM()) {
    case UIUserInterfaceIdiomPhone :
      return @"iphone";
    case UIUserInterfaceIdiomPad :
      return @"ipad";
    default :
      return @"omg";
  }
}

笔记:

  • 我建议将常量放在常量标头以外的地方。通常有一个位置(例如类)与常量更密切相关。
  • 不使用#define您的常量,请改用该extern NSString* const方法。
于 2012-08-28T16:35:20.210 回答
5
#define MY_CONSTANT ( ipad ? @"ipad" : @"iphone" )

或者

#define MY_CONSTANT ( (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) ? @"ipad" : @"iphone" )

编辑:以上内容适用于实时做出决定的通用应用程序。如果您想要编译时间决定,那么我通常在 IPAD 或 IPHONE 的 Xcode 目标中使用 PreProcessor Macro,甚至是 UNIVERSAL(构建 3 种方式):

#if defined(IPHONE)
#define MY_CONSTANT 4
#elif defined(IPAD)
#define MY_CONSTANT 6
#elif defined (UNIVERSALO)
#define MY_CONSTANT ( ipad ? 6 : 4 )
#endif

我觉得写起来很乏味,读起来也很乏味:

(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)

所以我创建了全局 BOOL 变量并在 appDelegate 中设置了值(在初始化中),然后放了一个“extern BOOL iPad;” 我的 pch 文件中的声明。在初始化:

ipad = (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) ? YES : NO;

我知道我知道,全局变量不好等等——是的,如果你过度使用它们,但对于这样的事情,它们是完美的。

于 2012-08-28T16:22:41.520 回答