如何在iPhone 3.1.3模拟器上运行通用应用程序?

时间:2010-05-03 15:41:34

标签: iphone xcode build-process ipad

我正在开发一款我希望在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;问题的博士版本 - 我错过了某处的设置吗?

3 个答案:

答案 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)

这对我有用:

  1. 使用SDK 3.2构建您的应用。
  2. 将活动SDK切换到iPhone模拟器3.1.3(或其他)。
  3. 从“运行”菜单中选择“调试(不是构建和调试)”。
  4. 3.2下构建的二进制文件将安装在3.x模拟器中而无需重建。完成后,不要忘记将活动SDK设置回3.2。