是否有编译iPad时设置的特定Xcode编译器标志?

问题描述:

编译iPad时是否有一个特定的Xcode编译器标志被设置?是否有编译iPad时设置的特定Xcode编译器标志?

我希望有条件编译的iPad VS例如iPhone/iPod Touch的代码:

#ifdef TARGET_IPAD 
    code for iPad 
#else 
    code for iPhone 
#endif 

我知道已经有TARGET_OS_IPHONE和TARGET_CPU_ARM在TargetConditionals.h但任何方便,专门针对iPad的?

-Rei

+0

我有相同问题。你有任何其他的解决方案做同样的事情,在你的问题..完全相同,我想要做但显示错误“符号未找到”帮助我做到这一点.. – Ayaz 2013-02-05 09:28:59

正确的API使用的iPad与iPhone/iPad的触摸运行时检查是:

BOOL deviceIsPad = ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad); 

的的UIDevice头文件管理器还包括一个方便的宏,UI_USER_INTERFACE_IDIOM(),这将是有益的,如果你的部署目标是< iPhone 3.2 。

#define UI_USER_INTERFACE_IDIOM() ([[UIDevice currentDevice] respondsToSelector:@selector(userInterfaceIdiom)] ? [[UIDevice currentDevice] userInterfaceIdiom] : UIUserInterfaceIdiomPhone) 

所以你也可以说,负:

BOOL deviceIsPad = (UI_USER_INTERFACE_IDIOM() != UIUserInterfaceIdiomPhone); 

而不是使用编译时间标志的,你应该使用运行时检查如使用NSClassFromString查看是否存在类,因为可以在两个设备上安装相同的应用程序。

由于在这两种设备上运行应用程序的可能性,因此没有内置编译时检查它是否以iPad为目标。

+1

肯尼是正确的。 Apple建议运行时检查API和对新框架的弱连接等。 您可以使用Erica Sadun的UIDevice Extensions(http://github.com/erica/uidevice-extension)轻松检查您在运行时运行的设备。 而正如肯尼所说,NSClassFromString,respondsToSelector和检查函数名称对NULL是你的朋友。 – Jasarien 2010-01-29 10:19:19

目前我没有发现任何能让你检查你是否在iPad上的东西,但我也不确定苹果是否推荐运行时检查。以下是苹果的摘录:

除了视图控制器之外,iPhone和iPad设备之间共享的任何类都需要包含条件编译宏来隔离设备特定的代码。虽然您也可以使用运行时检查来确定特定的类或方法是否可用,但这样做只会通过添加在一个设备或另一个设备上不会遵循的代码路径来增加可执行文件的大小。让编译器删除这些代码有助于保持代码清洁。

但是,没有地方可以找到关于条件编译宏的更多特定信息。

+0

是的,我也读过,所以我认为会有一些#define在某个地方,但我找不到它。目前,我正在使用UIScreen尺寸来检查iPad,但看起来并不很优雅。我会看看上面提到的UIDevice-extension。谢谢大家! -Rei – Rei 2010-01-29 20:51:51

对于共享相同项目/代码的多个目标,我通过编辑iPad目标的C标志来完成此操作。

选择[myapp] -iPad目标作为活动目标,选择Project - > Edit Active Target [myapp] -iPad。搜索“c标志”并双击。为“-D TARGET_IPAD”添加一个标志。现在符号TARGET_IPAD将只为您的iPad目标定义。

当然,这只适用于iPad和iPhone使用不同的目标。如果你在两个版本上都运行相同的二进制文件,显然编译器无法为你做什么。 (然而,3.2 SDK截至1月底甚至不支持通用应用程式吗。)

(编辑;我感到困惑的“通用”的应用程序等的术语)

+0

那么你是说苹果所说的神秘的通用应用程序甚至还不存在?有趣的是,如果我们需要两个不同的版本,那么这两个版本就可以提交给应用商店。苹果说这不是他们想要的。我在等着看这是怎么发生的。 – Justin 2010-02-02 19:29:52

+0

3.REDACTED SDK的发行说明表示构建UnivREDACTEDal Apps尚不受支持。我敢打赌它即将推出。 – qwzybug 2010-02-03 19:32:59

我认为这会做

-(BOOL)isDeviceAniPad 
{ 
#if __IPHONE_OS_VERSION_MIN_REQUIRED >= 30200 
    return ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad); 
#endif 
    return NO; 
} 
+0

只需使用'UI_USER_INTERFACE_IDIOM()' – user102008 2011-03-12 00:46:47

或 - >只是要确定

-(BOOL)isDeviceAniPad 
{ 
#if __IPHONE_OS_VERSION_MIN_REQUIRED >= 30200 
BOOL deviceIsPad = ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad); 
return deviceIsPad; 
#endif 
return NO; 
} 
+0

只需使用'UI_USER_INTERFACE_IDIOM()' – user102008 2011-03-12 00:45:55