7

iOS 上的 initWithNibName 很聪明:它会自动为 iPad 而不是 iPhone 加载不同的 NIB(尽管很多人不知道这一点 - 它没有记录在 UIViewController.initWithNibName 中!)。

但它还能做什么?我为此找到的唯一 Apple 文档解释说:

  1. 它将查找并查找名称末尾带有 ~ipad 或 ~iphone 的文件
  2. 苹果暗示它遵循自动图像文件名匹配的规则

但是没有指向图像匹配规则的链接,我也找不到任何明确的文档:(。

规则可能包括:“如果您将 @2x 放在文件名的末尾,您将获得不同的视网膜 NIB”(我不知道这是否有效)。

我真正要寻找的是使用了哪些规则的列表。如果我可以更多地使用它们的智能名称匹配(例如,如果它们有“加载横向笔尖与加载纵向笔尖”),它将节省大量的硬编码 - 在我编写的几乎每个应用程序中重复。

4

1 回答 1

2

要回答您的(主要)问题,这些是文件名匹配的规则initWithNibName

...但是,如果您不指定 nib 名称,并且不覆盖自定义子类中的 loadView 方法,则视图控制器会使用其他方式搜索 nib 文件。具体来说,它会查找具有适当名称(不带 .nib 扩展名)的 nib 文件,并在请求其视图时加载该 nib 文件。具体来说,它会(按顺序)查找具有以下名称之一的 nib 文件:

  1. 如果视图控制器类名以单词“Controller”结尾,如在 MyViewController 中,它会查找名称与类名匹配但不包含单词“Controller”的 nib 文件,如在 MyView.nib 中。
  2. 它查找名称与视图控制器类的名称匹配的 nib 文件。例如,如果类名为 MyViewController,它会查找 MyViewController.nib 文件。

来自nibName下的 UIViewController 文档

但还有更多……实际上,它NSBundle有一些非常聪明的规则来定位其中的资源。这是描述这些规则的文档页面 (请参阅:iOS 中的设备特定资源)。

这将我们带到此页面,该页面描述了可应用于捆绑资源的所有修饰符(和基本模式)(我相信这是您提到的有关图像文件名匹配的链接)。

于 2012-05-08T15:42:57.440 回答