【问题标题】:What are the differences between Xcode generated .nib/.xib and interface builder .nib/.xib template?Xcode 生成的 .nib/.xib 和界面生成器 .nib/.xib 模板有什么区别?
【发布时间】:2010-12-30 23:10:37
【问题描述】:

我是 iPhone 开发的新手,所以我一直在学习一些教程。我不明白的是 xib 如何融入工作流程。

在教程中,其中一条指令是创建一个新的 UIViewController 子类 选择“XIB for User Interface”。在我第一次尝试时,我忽略了检查该选项,我想我可以只在 Interface Builder 中创建 xib,但这没有用。 (我使用 Cocoa Touch View Template 创建了 xib,与 UIViewController 同名,并将其保存到项目目录中,因此它被添加到项目中。)我什至更改了文件所有者的类标识并连接了视图出口(当我检查从 Xcode 生成的 xib 时,我注意到了两个不同之处。)

那么 Xcode 生成的 .xib(来自 UIViewController 模板)和 IB .xib 模板有什么区别?

【问题讨论】:

    标签: iphone xcode interface-builder xib


    【解决方案1】:

    XIB文件基本上是一个未编译的NIB文件,XIBs总是可以在Xcode中编辑(除非它们已经过时或损坏),但大多数 NIB 被压缩(扁平)并且无法打开。然而,较旧的 NIB 是包含一些源/存档的捆绑包,包括 designable.nib 这通常只是重命名的 XIB 文件和一个 keyedobjects.nib 这是另一个编译的 NIB


    NIB = Nxt I接口Buider

    XIB = Xml I接口Buider


    尽管新归档的 NIB 文件无法对包括 Xcode 在内的大多数应用程序打开,但它们仍可能被取消归档。我在CharlesSoft 网站上发现了这个名为 NibUnlocker 的免费软件应用程序,它可以分解压缩的 Nib 文件并将其导出为 XIB 文件。此应用程序仍然存在相当多的错误,但根据 Nib 的内容,它有时非常准确。

    (NibUnlocker 是一个非常不准确的名称,Nib 未锁定它们已存档)


    Click to Download Nib Unlocker


    如果您想了解更多信息,可以阅读我在下面提供的关于 NIBXIB 格式的一些附加信息:

    Nxt 界面生成器剖析:

    存档的NIBs

    压缩的 NIB 文件是分析起来很复杂的文件,但这并非不可能。这些文件的结构基于压缩的属性列表(以“bplist00”开头),其中一些内容通过 NSKeyedArchiver 存档。由于 NIB 被格式化为属性列表,这允许一个小技巧:如果您实际上将 Nib 的扩展名更改为 .plist,例如。 ArchivedNib.nibArchivedNib.plist 实际上,您将能够在 Xcode 中将其作为属性列表查看。当您将 Nib 视为属性列表时,您可能会得到一些基本属性,例如 $version、$objects、$archiver 和 $top。

    实用说明

    CFKeyedArchiverUID 对象实际上是一个重定向器,在 {value = xx} 中,该值是一个 offset 为 $objects 数组中的项目从开始数组。例如。 <CFKeyedArchiverUID 0x60800002bc20 [0x7fffef6b8c30]>{value = 29},值 = 29,结果将是 $object 数组中的第 29 项。在 Objective C 中,您可以使用此方法从 NSArray 中检索此值:

    + (NSUInteger)valueForKeyedArchiverUID:(id)keyedArchiverUID {
      void *uid = (__bridge void*)keyedArchiverUID;
      NSUInteger *valuePtr = uid+16;
      return *valuePtr;}
    

    如果这有帮助就好了 ;-)

    【讨论】:

      【解决方案2】:

      听起来您通过设置 View outlet 并为 File's Owner 配置自定义类正确配置了视图 xib,但问题可能出在 UIViewController 子类上。

      如果您的视图控制器子类直接实现了 -[UIViewController loadView] 方法,则会阻止加载 NIB。在默认实现中,UIViewController 会加载与视图控制器同名的 NIB 文件。如果您重写此方法以以不同方式初始化视图(例如完全以编程方式),则加载 NIB 的默认实现将不会运行。

      删除子类中 -[UIViewController loadView] 方法的覆盖,或确保名称匹配,可能会解决任何差异。

      【讨论】:

        【解决方案3】:

        在 Xcode 中作为新文件流的一部分创建的 XIB 文件已预先设置其 File's Owner 类,以及已连接的某些出口(视图)。否则,差别不大。

        【讨论】:

          【解决方案4】:

          XIB 是 XML。区分它们并自己找出答案。

          【讨论】:

            【解决方案5】:

            我不确定我是否在关注您的问题。当您在 Xcode 中创建 xib 文件时,尝试编辑 xib 文件会弹出 IB。如此有效地使用 IB 在 Xcode 中编辑 xib 文件。我从未尝试在 IB 中创建“独立”xib 文件,然后将其连接到 xcode 中的项目。

            这种方法可能不起作用的唯一原因是,当您在项目的上下文中创建 xib 文件时,会创建关联(例如 plist 中的“mainnib 文件基本名称”属性),这些关联不会自动当您尝试在 xcode 项目中使用独立的 xib 文件时生成。

            【讨论】:

              猜你喜欢
              • 2017-01-13
              • 2012-03-31
              • 2012-09-03
              • 1970-01-01
              • 2011-04-13
              • 2011-08-06
              • 2010-11-07
              • 1970-01-01
              相关资源
              最近更新 更多