iPhone開發中關於Nib檔案講解是本文要介紹的內容,不多說,來看詳細內容 。一個簡單的iPhone項目及代碼,不用Interface Builder開發iPhone程式,一個細微的差別 loadNibNamed:owner:options: 用過delphi的童鞋應該比較清楚frm檔案,就是用滑鼠拖拖拉拉,就能設計好的那個表單所產生的檔案 。 在使用xcode進行開發時,也用了同樣的形式,把複雜的頁面通過簡單的拖拉以及屬性設定來設計出來,然後序列化到Nib檔案裡,等程式啟動並執行時候,載入進來就可以了 。 在xcode進行表單開發時,有兩種形式把Nib檔案還原序列化 。 一種是通過設定view controller的NIB File屬性 。 另外一種便是通過initWithNibName方法 。 第二種其實沒什麼好說的,就是讀取nib檔案,載入,還原序列化,產生執行個體,顯示 。 對於第一種,有些地方做的有些蹊蹺,百思不得其解 。 假設要為主表單Window添加一個View,xcode中現有View-based模板的做法是,先建立一個帶Nib檔案(假設為MyViewController.xib)的UIViewController自訂子類(假設為MyViewController.m) 。 然後把MainWindow.xib中的View Controller執行個體的class name設為這個自訂子類MyViewController,並指定NIB File為剛才建立的Nib檔案(MyViewController.xib) 。 但是經過測試,其實只要設定了class,不指定NIB File也是可以的 。 當然如果在delegate裡使用viewController的超類UIViewController來定義property的話(這樣做的目的是能把MainWindow.xib中的View Controller的插頭,插到delegate裡的插座上),也可以只指定NIB File來實現載入 。 但是如果把class name和NIB File設成各自不關聯的類和nib檔案會怎樣呢? 答案是以NIB File為主 。 比如說,我們設定delegate的property為UIViewController 。 但是可以指定MainWindow.xib中View Controller的class為MyViewController1(其對應Nib檔案為MyViewController1.xib) 但是我們設定這個View Controller的NIB File為MyViewController2.xib(其File Owner為MyViewController2.m),那麼實際載入進來的是MyViewController2.xib裡的View 。 在設計MainWindow.xib中View Controller的時候,除了載入其他的Nib檔案外,也可以直接設計其View,也就是說不需要另外的nib檔案,直接在MainWindow.xib進行設計 。當兩者同時進行的時候,以MainWindow.xib中設計的表單為主,也就是說即使load了其他Nib檔案,也不會呈現出來 。 對於有潔癖,或者有重度自我強迫症的人來說,是不需要這種快餐式的設計的 。 那就是拋棄一切Nib檔案,所有的表單設計都在代碼中完成 。 改造Window-Based模板, 1.從project中刪除MainWindow.xib檔案 2.從Info.plist中,刪除Main nib file base name項 3.編輯main.m 把這句Java代碼 1 int retVal = UIApplicationMain(argc, argv, nil, nil); 2 int retVal = UIApplicationMain(argc, argv, nil, nil); 改為Java代碼 3 int retVal = UIApplicationMain(argc, argv, nil, @"___PROJECTNAMEASIDENTIFIER___AppDelegate"); 4 5 int retVal = UIApplicationMain(argc, argv, nil, @"___PROJECTNAMEASIDENTIFIER___AppDelegate"); 4.編輯___PROJECTNAMEASIDENTIFIER___AppDelegate.m 把方法 Java代碼 6 - (void)applicationDidFinishLaunching:(UIApplication *)application { 7 8 // Override point for customization after application launch 9 [window makeKeyAndVisible]; 10 } 11 12 - (void)applicationDidFinishLaunching:(UIApplication *)application { 13 14 // Override point for customization after application launch 15 [window makeKeyAndVisible]; 16 } 改為Java代碼 17 - (void)applicationDidFinishLaunching:(UIApplication *)application { 18 UIWindow *wd = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 19 self.window = wd; 20 [wd release]; 21 [window makeKeyAndVisible]; 22 23 } 24 25 - (void)applicationDidFinishLaunching:(UIApplication *)application { 26 UIWindow *wd = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 27 self.window = wd; 28 [wd release]; 29 [window makeKeyAndVisible]; 30 31 } 當然,不改寫模板程式,使用window-based模板產生架構後,按照上述方法改寫程式也是可以的 |