iPhone開發(fā)中關(guān)于Nib文件講解
iPhone開發(fā)中關(guān)于Nib文件講解是本文要介紹的內(nèi)容,不多說(shuō),來(lái)看詳細(xì)內(nèi)容。一個(gè)簡(jiǎn)單的iPhone項(xiàng)目及代碼,不用Interface Builder開發(fā)iPhone程序,一個(gè)細(xì)微的差別 loadNibNamed:owner:options:
用過delphi的童鞋應(yīng)該比較清楚frm文件,就是用鼠標(biāo)拖拖拉拉,就能設(shè)計(jì)好的那個(gè)窗體所生成的文件。
在使用xcode進(jìn)行開發(fā)時(shí),也用了同樣的形式,把復(fù)雜的頁(yè)面通過簡(jiǎn)單的拖拉以及屬性設(shè)置來(lái)設(shè)計(jì)出來(lái),然后序列化到Nib文件里,等程序運(yùn)行的時(shí)候,加載進(jìn)來(lái)就可以了。
在xcode進(jìn)行窗體開發(fā)時(shí),有兩種形式把Nib文件反序列化。
一種是通過設(shè)置view controller的NIB File屬性。
另外一種便是通過initWithNibName方法。
第二種其實(shí)沒什么好說(shuō)的,就是讀取nib文件,加載,反序列化,生成實(shí)例,顯示。
對(duì)于***種,有些地方做的有些蹊蹺,百思不得其解。
假設(shè)要為主窗體Window添加一個(gè)View,xcode中現(xiàn)有View-based模板的做法是,先創(chuàng)建一個(gè)帶Nib文件(假設(shè)為MyViewController.xib)的UIViewController自定義子類(假設(shè)為MyViewController.m)。
然后把MainWindow.xib中的View Controller實(shí)例的class name設(shè)為這個(gè)自定義子類MyViewController,并指定NIB File為剛才創(chuàng)建的Nib文件(MyViewController.xib)。
但是經(jīng)過測(cè)試,其實(shí)只要設(shè)定了class,不指定NIB File也是可以的。
當(dāng)然如果在delegate里使用viewController的超類UIViewController來(lái)定義property的話(這樣做的目的是能把MainWindow.xib中的View Controller的插頭,插到delegate里的插座上),也可以只指定NIB File來(lái)實(shí)現(xiàn)加載。
但是如果把class name和NIB File設(shè)成各自不關(guān)聯(lián)的類和nib文件會(huì)怎樣呢?
答案是以NIB File為主。
比如說(shuō),我們?cè)O(shè)定delegate的property為UIViewController。
但是可以指定MainWindow.xib中View Controller的class為MyViewController1(其對(duì)應(yīng)Nib文件為MyViewController1.xib)
但是我們?cè)O(shè)定這個(gè)View Controller的NIB File為MyViewController2.xib(其File Owner為MyViewController2.m),那么實(shí)際加載進(jìn)來(lái)的是MyViewController2.xib里的View。
在設(shè)計(jì)MainWindow.xib中View Controller的時(shí)候,除了加載其他的Nib文件外,也可以直接設(shè)計(jì)其View,也就是說(shuō)不需要另外的nib文件,直接在MainWindow.xib進(jìn)行設(shè)計(jì)。當(dāng)兩者同時(shí)進(jìn)行的時(shí)候,以MainWindow.xib中設(shè)計(jì)的窗體為主,也就是說(shuō)即使load了其他Nib文件,也不會(huì)呈現(xiàn)出來(lái)。
對(duì)于有潔癖,或者有重度自我強(qiáng)迫癥的人來(lái)說(shuō),是不需要這種快餐式的設(shè)計(jì)的。
那就是拋棄一切Nib文件,所有的窗體設(shè)計(jì)都在代碼中完成。
改造Window-Based模板,
1.從project中刪除MainWindow.xib文件
2.從Info.plist中,刪除Main nib file base name項(xiàng)
3.編輯main.m
把這句Java代碼
- int retVal = UIApplicationMain(argc, argv, nil, nil);
- int retVal = UIApplicationMain(argc, argv, nil, nil);
改為Java代碼
- int retVal = UIApplicationMain(argc, argv, nil, @"___PROJECTNAMEASIDENTIFIER___AppDelegate");
- int retVal = UIApplicationMain(argc, argv, nil, @"___PROJECTNAMEASIDENTIFIER___AppDelegate");
4.編輯___PROJECTNAMEASIDENTIFIER___AppDelegate.m
把方法 Java代碼
- - (void)applicationDidFinishLaunching:(UIApplication *)application {
- // Override point for customization after application launch
- [window makeKeyAndVisible];
- }
- - (void)applicationDidFinishLaunching:(UIApplication *)application {
- // Override point for customization after application launch
- [window makeKeyAndVisible];
- }
改為Java代碼
- - (void)applicationDidFinishLaunching:(UIApplication *)application {
- UIWindow *wd = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
- self.window = wd;
- [wd release];
- [window makeKeyAndVisible];
- }
- - (void)applicationDidFinishLaunching:(UIApplication *)application {
- UIWindow *wd = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
- self.window = wd;
- [wd release];
- [window makeKeyAndVisible];
- }
當(dāng)然,不改寫模板程序,使用window-based模板生成框架后,按照上述方法改寫程序也是可以的。
小結(jié):iPhone開發(fā)中關(guān)于Nib文件講解的內(nèi)容介紹完了,希望本文對(duì)你有所幫助!