iOS:使用设备修饰符加载xib文件?

时间:2011-03-04 08:43:36

标签: iphone objective-c cocoa-touch ipad ios

您可以使用设备修改器(即~ipo)在Info.plist中提供设备特定的密钥,并指定特定于设备的启动图像(适用于iPhone的Default.png和默认的~ipad.png) iPad,例如)。 Apple Docs中特别提到了这两件事,但他们并未说这适用于任何其他类型的文件。

我发现(非常偶然)这适用于通过initWithNibName:bundle:加载.xib文件。例如,我可以使用MyView.xib和MyView~ipo.xib,以及此代码:

MyViewController *viewController = [[MyViewController alloc] 
                                     initWithNibName:@"MyView" bundle:nil];

...将在iPad上完全加载MyView~ipo.xib,在其他设备上加载MyView.xib。

所以,1)这是在某处记录的吗?我肯定找不到任何Apple文档。它肯定比检查UI_USER_INTERFACE_IDIOM()并在任何地方硬编码两个不同的笔尖名称更容易,但如果没有记录,我有点不相信它。

并且,2)有谁知道这个iOS开始工作的版本是什么?我只在4.2中试过它,它在那里工作。一般来说,设备修改器(即使是上面列出的文档内容)也是4.0最小值。

4 个答案:

答案 0 :(得分:50)

我有同样的问题。答案一开始没有意义,但好消息是它很容易做到! :)

只需在没有任何修改器的情况下为您的iPad xib命名,并使用~iphone修饰符指定您的iPhone xib,它就会正确选择它们。

因此,使用MyViewController,您将获得iPad的MyViewController.xib和iPhone的MyViewController~iphone.xib。然后你可以用简单的alloc / init来初始化你的视图控制器。

[[MyViewController alloc] init]它会抓住正确的xib。

所以,当我在XCode中创建一个新的视图控制器时,我总是选择用于为ipad格式化它的框,因为它将创建的xib将命名为MyViewController.xib,你希望那个是iPad大小的xib。然后我创建了第二个xib,为iPhone格式化,并使用~iphone修饰符命名。

文档有时会有点矛盾,但本页讨论了带有标识符的资源如何默认为iPad。

ImageSoundResources

查看有关使用高分辨率图像的部分。我知道我们正在谈论xib而不是图像,但它确实有效。我的最后6个应用程序都使用了这个成语。

答案 1 :(得分:25)

实际上,它在文档中明确定义,但作为脚注。

CocoaNibs

在“使用NSBundle加载NIB文件”底部的注释中:

  

注意:如果你正在开发一个   适用于iOS的通用应用程序,您可以   使用特定于设备的命名   约定加载正确的笔尖   底层设备的文件   自动。欲获得更多信息   关于如何命名你的nib文件,请参阅   “iOS支持特定于设备   资源“。

指向Cocoa Conceptual LoadingResources

的链接

但是,是的,这是4.0+唯一的功能。

答案 2 :(得分:3)

我讨厌那个人并回答我自己的问题,但我认为答案是:

1)没有,没有明确记录在任何Apple文档中,以及
2)4.0及更高版本(基于我自己的测试)

您真正保存的是几行代码检查UI_USER_INTERACE_IDIOM()。不过,我会接受它。代码越少,代码越少。

答案 3 :(得分:2)

在iOS 3.2及更高版本中使用的适当技术是UI_USER_INTERFACE_IDIOM()功能。我通常使用三元运算符来使用适当的XIB初始化UIViewController

UIViewController* controller = [[UIViewController alloc] 
    initWithNibName:UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad ? 
    @"YourViewController-iPad" : @"YourViewController" andBundle:nil];