【问题标题】:What is the pattern that UIKit uses to figure out the right nib name to load?UIKit 使用什么模式来确定要加载的正确 nib 名称?
【发布时间】:2012-01-31 14:18:11
【问题描述】:

我有一个奇怪的问题: 当您没有明确指定 nibName 时,UIKit 使用什么模式来确定 UIViewController 的正确 nib 名称?

我为什么要问?

因为我认为(有充分的理由)系统会首先寻找与控制器类同名的 nib。 也就是说,如果我有VideoViewController,系统会先查找VideoViewController.xib

显然情况并非如此。 我还有另一个类VideoView,它是UIView 的子类。我有一个名为VideoView.xib 的笔尖,其中包含VideoView 的所有视图层次结构。

当我尝试运行该应用程序时,它会立即崩溃并出现setValue:ForUndefinedKey 异常。 我注意到密钥始终是来自 VideoView.xib 的密钥,而 not 来自VideoViewController.xib。这意味着系统正在尝试为名为@9​​87654333@ 的视图控制器加载VideoView.xib

似乎如果系统会找到一个名称与控制器类名称相似的 nib - 只是没有“Controller”后缀,它将使用该 nib。

我通过将我的班级重命名为VideosViewController(带有's')确认了这一点,一切正常。

还有像这样的边缘条件吗? 或者有没有指定具体算法的地方?

我花了一个小时来调试这个,我不想在以后再浪费时间在同样的问题上......

谢谢!

【问题讨论】:

    标签: iphone ios cocoa-touch uiviewcontroller uikit


    【解决方案1】:

    来自 UIViewController.nibName 属性的文档:

    如果你使用一个 nib 文件来存储你的视图控制器的视图,它是 建议您在以下情况下明确指定该 nib 文件 初始化您的视图控制器。但是,如果您不指定 nib 名称,并且不要覆盖自定义中的 loadView 方法 子类,视图控制器使用其他方法搜索 nib 文件 方法。具体来说,它会查找具有适当名称的 nib 文件 (没有 .nib 扩展名)并在其视图时加载该 nib 文件 被要求。具体来说,它会(按顺序)查找 nib 文件 以下名称之一:

    1. 如果视图控制器类名以单词“Controller”结尾,如 在 MyViewController 中,它会查找名称与 不带“Controller”一词的类名,如 MyView.nib。
    2. 看起来 对于名称与视图控制器名称匹配的 nib 文件 班级。例如,如果类名是 MyViewController,它看起来 对于 MyViewController.nib 文件。

    【讨论】:

    • 天哪...我阅读了除此属性之外的所有文档...我查看了 view、loadView 等...谢谢!
    猜你喜欢
    • 2010-12-07
    • 2010-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-24
    • 2011-12-31
    • 2011-09-06
    • 1970-01-01
    相关资源
    最近更新 更多