【发布时间】:2012-09-10 09:19:22
【问题描述】:
我的应用最初是一款仅限 iPad 的应用。现在我将其转换为适合 iPhone 的较小版本。我使用的是相同的代码库,并且许多控制器实际上不需要进行太多更改 - 只是需要重新制作视图以适应较小的屏幕。这不是一款通用应用,因为 iPad 和 iPhone 版本之间的某些功能不同,而且 App Store 中的价格点也大不相同。
我添加了单独的目标,并将设备系列设置为 iPhone。原始目标将此设置为 iPad。
我用view~iphone.xib 格式的文件名重新制作了一堆笔尖,当我在 iPhone 上运行 iPhone 版本时,这些笔尖被正确加载,而不是原来的 iPad 笔尖(文件名格式为 view.xib )。
问题是当我在 iPad 上运行 iPhone 构建时。正如您对 iPhone 应用程序所期望的那样,它在那个小 iPhone 窗口中运行(可以加倍到 2 倍)。但加载的笔尖是 iPad 笔尖,显然不适合 iPhone 大小的显示器或调整其大小。我不明白为什么 iOS 不会自动加载 iPhone 版本。如果我测试UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad,它返回false,所以它知道它在iPhone模式下运行!
鉴于我无法阻止客户在 iPad 上运行 iPhone 应用程序,我想让它正常工作。我尝试了一些方法,但它们似乎不正确:
- 将代码更改为
[[MyViewController alloc] initWithNibName:@"MyView~iphone" bundle:nil];将加载正确的笔尖,但这意味着我必须在指定笔尖名称的所有位置周围放置条件代码 - 这是一个很大的应用程序,所以有很多,而且将来当我或其他开发人员忘记在新代码中执行此操作时,这可能很容易出错。 - 重命名所有
~iphonenib,使其具有与iPad 版本相同的文件名(即view.xib),将它们移动到单独的目录中(这样它们就不会与原件的名称冲突)并重新将它们添加回项目,但仅包含在 iPhone 目标(而不是 iPad 目标)中,并从 iPhone 目标(但仍包含在 iPad 目标中)取消勾选原始 iPad 笔尖将导致在运行时加载正确的笔尖(因为“错误”的笔尖不再包含在每个构建的捆绑包中),无论命名如何。请注意,如果我将文件名保留为view~iphone.xib,那么当 iPhone 构建在 iPad 上运行时,尝试加载该笔尖时会出现异常:Could not load NIB in bundle。相同的文件名使这种方法非常不愉快,乍一看并不明显发生了什么。 - 将原始 xib 重命名为
view~ipad.xib(iPhone nib 为view~iphone.xib)仍会导致在 iPad 上运行 iPhone 版本时加载 iPad nib。
一定有比这两种方法更好的方法吗?当设备清楚地知道它正在运行 iPhone 应用程序时,为什么会加载错误的 (iPad) 笔尖?
【问题讨论】: