2009-12-30 54 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;} 

一樣,如果這有助於;-)

相關問題