我正在开发一款我希望在iPhone和iPad上普及的新应用。我开始使用“创建基于窗口的应用程序”向导,它在“iPhone”和“iPad”组中创建了单独的应用程序代理。由于我已经非常熟悉iPhone开发,我做了我项目的那部分,现在我已经准备好做一些iPad的东西了。
所以...我开始时将UISplitViewController添加到我的iPad委托,将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;问题的博士版本 - 我错过了某处的设置吗?
答案 0 :(得分:39)
我使用这个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];
这样的事情可以使编码更简单,条件更少。仍然需要测试一切两次。
答案 1 :(得分:23)
恰恰相反。通用应用程序在iPhone和iPad上运行相同的二进制文件,因此您无法使用条件编译来区分这两个版本。但您需要在文档中使用宏Apple引用:
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
// iPad-specific code
} else {
// iPhone-specific code
}
答案 2 :(得分:0)
这对我有用:
3.2下构建的二进制文件将安装在3.x模拟器中而无需重建。完成后,不要忘记将活动SDK设置回3.2。