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

为iPad编译时是否设置了特定的Xcode编译器标志?,ipad,iphone-sdk-3.2,Ipad,Iphone Sdk 3.2,为iPad编译时是否设置了特定的Xcode编译器标志 我想有条件地编译iPad与iPhone/iPod Touch的代码,例如: #ifdef TARGET_IPAD code for iPad #else code for iPhone #endif 我知道TargetConditionals中已经有了TARGET_OS_IPHONE和TARGET_CPU_ARM。但是有什么可以轻松且专门针对iPad的吗 -Rei您应该使用运行时检查,而不是使用编译时标志,例如,使用NSClas

为iPad编译时是否设置了特定的Xcode编译器标志

我想有条件地编译iPad与iPhone/iPod Touch的代码,例如:

#ifdef TARGET_IPAD
   code for iPad
#else
   code for iPhone
#endif
我知道TargetConditionals中已经有了TARGET_OS_IPHONE和TARGET_CPU_ARM。但是有什么可以轻松且专门针对iPad的吗


-Rei

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


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

目前,我没有找到任何东西可以让你检查你是否在iPad上,但我也不确定苹果是否推荐运行时检查。以下是苹果公司的一段摘录:

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


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

对于共享同一项目/代码的多个目标,我正在通过编辑我的iPad目标的C标志来实现这一点

选择[myapp]-iPad目标作为活动目标,选择项目->编辑活动目标[myapp]-iPad。搜索“c标志”并双击。为“-D TARGET_IPAD”添加标志。现在,符号TARGET_IPAD将仅为您的IPAD目标定义

当然,这只适用于iPad和iPhone使用不同目标的情况。如果您在这两个服务器上运行相同的二进制文件,显然编译器无法为您做任何事情。(然而,截至1月底的3.2 SDK甚至还不支持通用应用。)


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

用于运行时检查iPad与iPhone/iPad Touch的正确API是:

BOOL deviceIsPad = ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad);
UIDevice头文件管理器还包括一个方便的宏,即UI_USER_INTERFACE_IDIOM()

#define UI_USER_INTERFACE_IDIOM() ([[UIDevice currentDevice] respondsToSelector:@selector(userInterfaceIdiom)] ? [[UIDevice currentDevice] userInterfaceIdiom] : UIUserInterfaceIdiomPhone)
所以你可以消极地说:

BOOL deviceIsPad = (UI_USER_INTERFACE_IDIOM() != UIUserInterfaceIdiomPhone);
我想这个就行了

-(BOOL)isDeviceAniPad
{   
#if __IPHONE_OS_VERSION_MIN_REQUIRED >= 30200
  return ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad);
#endif
  return NO;
}
或者->只是确定一下

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

肯尼是对的。苹果建议运行时检查API和针对新框架的弱链接等。您可以使用Erica Sadun的UIDevice Extensions(),在运行时轻松检查正在运行的设备。正如Kenny所说,NSClassFromString、respondsToSelector和检查函数名是否为NULL都是你的朋友。是的,我也读过这篇文章,所以我认为会有一些定义,但我找不到它。现在,我正在用UIScreen的尺寸来检查iPad上是否有,但这看起来并不优雅。我将看看上面提到的UIDevice扩展。谢谢大家-ReiSo你是说苹果所说的神秘的通用应用程序甚至不可能存在?有趣的是,如果我们需要有两个不同的版本,那就是提交给应用商店的两个不同版本。苹果说这不是他们想要的。我在等着看结果如何。3.0版本SDK的发行说明说,还不支持构建UnivREDACTEDal应用程序。我打赌它很快就会来。只要使用
UI\u用户界面\u习惯用法()
只要使用
UI\u用户界面\u习惯用法()
我也有同样的问题。你有没有其他解决办法来解决你的问题。。与我想做的完全相同,但显示错误“未找到符号”帮助我完成此操作。。