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

您可以使用设备修饰符(即〜ipad)在Info.plist中提供特定于设备的密钥,并指定特定于设备的启动图像(iPhone的Default.png和iPad的Default〜ipad.png)例)。 苹果文档中特别提到了这两件事,但是他们并不认为这可以用于任何其他types的文件。

我发现(非常偶然),这通过initWithNibName:bundle:来加载.xib文件。 所以例如,我可以有MyView.xib和MyView〜ipad.xib,并且这个代码:

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

…将在iPad上完全加载MyView〜ipad.xib,在其他设备上加载MyView.xib。

所以,1)这是logging在什么地方? 我当然找不到任何苹果文档。 这肯定比检查UI_USER_INTERFACE_IDIOM()和硬编码两个不同的nib名称更加容易,但是如果没有logging,我还是不要相信它。

而且,2)有没有人知道这个版本的iOS开始工作? 我只在4.2版本中试过,而且在那里工作。 一般的设备修改器(即使是上面列出的文档)都是4.0。

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

CocoaNibs

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

注意:如果您正在为iOS开发Universal应用程序,则可以使用特定于设备的命名约定自动为基础设备加载正确的nib文件。 有关如何命名您的笔尖文件的更多信息,请参阅“iOS支持设备特定的资源”。

哪个链接到cocoa概念LoadingResources

但是,是的,这是一个只有4.0+的function。

我有这个相同的问题。 起初答案没有意义,但好消息是,这很容易做到! 🙂

只需将您的iPad xib命名为不带任何修饰符,您的iPhone xib使用〜iphone修饰符,然后将其正确select。

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

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

所以,当我在XCode中创build一个新的视图控制器时,我总是select这个盒子来格式化它的ipad,因为它将创build的xib将被命名为MyViewController.xib,并且你希望那个是iPad大小的xib。 然后我创build第二个xib,为iPhone设置格式,并用〜iphone修饰符命名。

这个文档有时候有点矛盾,但是这个页面讲述了带标识符的资源如何默认为iPad。

ImageSoundResources

检查有关使用高分辨率图像的部分。 我知道我们正在谈论xibs而不是图片,但它确实有效。 我最后的6个应用程序都使用这个习惯用法。

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

1)没有,没有明确记载在任何苹果文件,和
2)4.0以上(这是基于我自己的testing)

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

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

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