【问题标题】:iOS: Using device modifiers for loading xib files?iOS:使用设备修饰符加载 xib 文件?
【发布时间】:2011-07-08 16:01:55
【问题描述】:

您可以使用设备修饰符(即~ipad)在 Info.plist 中提供设备特定的键,并指定设备特定的启动图像(iPhone 为 Default.png,iPhone 为 Default~ipad.png例如 iPad)。 Apple Docs 中特别提到了这两件事,但他们并没有说这适用于任何其他类型的文件。

我发现(很偶然)这适用于通过initWithNibName:bundle: 加载.xib 文件。所以比如说我可以有MyView.xib和MyView~ipad.xib,这段代码:

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

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

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

而且,2) 有谁知道这开始工作的 iOS 版本是什么?我只在 4.2 中尝试过,它在那里工作。一般的设备修饰符(即使是上面列出的文档)最低为 4.0。

【问题讨论】:

  • 好地方。很确定这是 4.0 以后的版本,当然适用于通用应用程序;虽然也许这适用于 iPad 上的 3.2?回顾 bundle 编程指南,它确实总是使用图像作为资源加载的示例,但再次阅读,可能是所有加载的资源都通过相同的机制退出了 app bundle?

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


【解决方案1】:

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

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

【讨论】:

  • iOS 已内置命名方案,因此您无需包含此三元条件内容。如果您正确命名 xib,则可以使用简单的 alloc/init。
  • 对,使用三元运算符是一个不错的方法,但如果只是正确命名 xibs 可以完成同样的工作,我宁愿这样做。我想我是在说,并没有真正回答我的问题。
【解决方案2】:

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

只需将您的 iPad xib 命名为不带任何修饰符的名称,并将您的 iPhone xib 命名为 ~iphone 修饰符,它就会正确选择它们。

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

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

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

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

ImageSoundResources

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

【讨论】:

  • 这很好,但我的意思是,在任何官方文档中都没有提到资源文件通常使用设备修饰符习语。我希望看到有关该行为的官方文档,和/或一些有关最低 iOS 版本的官方文档。
  • 我觉得你,我从来没有在文档中找到任何明确说明 xibs 的内容,但是当我找到上面关于图像的链接文档时,我决定尝试一下,希望它会也适用于 xibs ......和中提琴,它确实......从那时起,开发就变得轻而易举。我从 4.0 开始使用它。对不起,我可以给你最好的!
【解决方案3】:

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

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

您真正节省的只是几行代码检查 UI_USER_INTERACE_IDIOM()。不过,我会接受的。更少的代码就是更少的代码。

【讨论】:

    【解决方案4】:

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

    CocoaNibs

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

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

    链接到Cocoa Conceptual LoadingResources

    但是,是的,这是 4.0+ 独有的功能。

    【讨论】:

      猜你喜欢
      • 2012-10-06
      • 1970-01-01
      • 2012-05-12
      • 1970-01-01
      • 1970-01-01
      • 2017-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多