Xcode生成.nib / .xib和界面生成器.nib / .xib模板之间有什么区别?

时间:2009-12-30 00:02:14

标签: iphone xcode interface-builder xib

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

在教程中,其中一条指令是创建一个新的UIViewController子类,其中选择了“XIB for User Interface”。在我第一次尝试时,我忽略了检查该选项,我想可能是我可以在Interface Builder中创建xib,但这不起作用。 (我使用Cocoa Touch视图模板创建了xib,其名称与UIViewController相同,并将其保存到项目目录中,以便将其添加到项目中。)我甚至更改了文件所有者的类标识并连接了视图插座(我在检查Xcode生成的xib时注意到的两个差异。)

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

5 个答案:

答案 0 :(得分:3)

作为Xcode中新文件流的一部分创建的XIB文件预先设置了其文件所有者类,以及已连接的某些出口(视图)。否则,没有太大区别。

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

听起来您通过设置View插件并为File的Owner配置自定义类来正确配置视图xib,但问题可能在于UIViewController子类。

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

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

答案 3 :(得分:0)

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

  

NIB = N xt nterface B uilder

     

XIB = X ml nterface B uilder

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

(NibUnlocker是一个非常不准确的名字,Nibs没有锁定它们被存档)

Click to Download Nib Unlocker

如果您想了解更多信息,可以阅读我在下面提供的有关 NIB XIB 格式的其他信息:

  

Nxt Interface Builder Anatomy:

     

已存档 NIB s

     

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

     

实用笔记

     

CFKeyedArchiverUID 对象实际上是一个重定向器,在{value = xx}中,值为$ em>偏移,表示$ 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;}

如果这有帮助的话; - )

答案 4 :(得分:-2)

XIB是XML。区分它们并找出适合自己的方法。