1

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

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

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

4

5 回答 5

3

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

于 2009-12-30T00:38:43.600 回答
1

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


NIB = N xt接口构建_

XIB = X ml接口构建_


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

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


点击下载笔尖解锁器


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

Nxt 界面生成器剖析:

存档的NIB

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

有用的笔记

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

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

就像这有帮助;-)

于 2017-07-21T10:24:39.873 回答
0

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

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

于 2009-12-30T00:10:39.960 回答
0

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

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

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

于 2011-08-30T06:44:34.750 回答
-2

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

于 2009-12-30T00:19:06.903 回答