2009-12-30 58 views
1

我是iPhone新手,所以我一直在研究一些教程。我不明白的是xib如何适应工作流程。Xcode生成的.nib/.xib和界面生成器.nib/.xib模板之间有什么区别?

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

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

回答

0

我不确定我是否在追踪您的问题。在Xcode中创建xib文件时,尝试编辑xib文件会显示IB。所以有效地使用IB来编辑Xcode中的xib文件。我从来没有尝试在IB中创建“独立”xib文件,然后将它连接到xcode中的项目。

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

-2

XIB是XML。区分他们并找出你自己。

3

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

0

听起来好像你通过设置View出口并为文件所有者配置自定义类来正确配置视图xib,但问题可能是UIViewController子类。

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

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

0

XIB File是basicly一个uncompile NIB文件,XIB S能够始终在Xcode (除非它们是过时的或损坏)但最NIB s的压缩(平坦的)和被编辑无法开启。然而旧NIB s为含有一些源束/存档包括designable.nib这常常是就在更名XIB文件和一个keyedobjects.nib其是其它编译NIB


NIB = N xt I nterface B uilder

XIB = X毫升覆盖整个院落 uilder


虽然新存档NIB文件是不能打开到最应用,包括Xcode中,他们仍然可以潜在地是未归档。我发现这个所谓的NibUnlocker免费的应用程序在CharlesSoft网站这有可能拆解压缩笔尖文件导出为一个XIB文件。这个应用程序仍然相当麻烦,但它有时是非常准确的基于Nib的内容。

(NibUnlocker是非常不准确的名称,碎粒没有锁定在归档)


Click to Download Nib Unlocker


如果你想知道多一点,你可以阅读一些额外的信息我提供了如下关于NIBXIB格式:

NXT Interface Builder的解剖:

存档NIB小号

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

有用的注

CFKeyedArchiverUID对象实际上是一个重定向器,在{值= XX},该值为项$对象阵列中的一个偏移从的开始阵列。例如。 <CFKeyedArchiverUID 0x60800002bc20 [0x7fffef6b8c30]>{value = 29},值= 29,结果将是$对象数组中的第29项。在Objective C中,你可以用这个方法来检索从一个NSArray这个值:

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

一样,如果这有助于;-)

相关问题