我正在开发一款我希望在iPhone和iPad上普及的新应用.我开始使用"创建基于窗口的应用程序"向导,它在"iPhone"和"iPad"组中创建了单独的应用程序代理.由于我已经非常熟悉iPhone开发,我做了我项目的那部分,现在我已经准备好做一些iPad的东西了.
所以...我开始通过向我的iPad委托添加UISplitViewController,将Active SDK切换到3.2,它的工作原理!但是当我切换回3.1.3并尝试在模拟器中运行它时,Build and Go失败了.对于初学者,我看到:
... path .../iPad/AppDelegate_Pad.h:13:错误:'UISplitViewController'之前的预期说明符限定符列表
我的Base SDK设置为3.2,部署目标设置为3.1.3.我觉得这就够了.但我也在文档中找到了有条件地编译的方法:
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 30200 MyIPadViewController* vc; // Create the iPad view controller #else MyIPhoneViewController* vc; // Create the iPhone view controller #endif
所以我到处都需要这样做吗?这似乎是一个可怕的很多代码来添加(我会得到在短时间内摆脱了4.0反正),所以我觉得我必须做一些错误的.而且,我甚至不知道它如何适用于@property或@synthesize声明之类的东西.
tl;博士问题的版本 - 我错过了某个地方的设置吗?
我使用这个C函数来帮助保持代码简洁:
BOOL isPad() { return (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad); }
我做的另一件事,当我有iPhone和iPad的不同xib文件.我有一个stripPadSuffixOnPhone()函数,可以帮助保持代码更简单:
// Load/create the Delete table cell with delete button self.deleteCell = [Utilities loadNib:stripPadSuffixOnPhone(@"DeleteCell~ipad") ClassName:@"DeleteCell" Owner:self];
这样的事情可以使编码更简单,条件更少.仍然必须测试一切两次.
恰恰相反.通用应用程序在iPhone和iPad上运行相同的二进制文件,因此您无法使用条件编译来区分这两个版本.但是您需要在文档中使用宏Apple引用:
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) { // iPad-specific code } else { // iPhone-specific code }