分類: IOS2012-10-31 17:04 5154人閱讀 評論(0) 收藏 舉報ios
記得幾個月前剛接觸ios時,由於要急着完成任務,搭建應用的方式徹底按照書本,而書本講的是xcode3,而裝的xcode的版本是4。因此,書上的一些東東和xcode的版本對不上,很是苦惱,爲了建立一個windows base 的project,都費勁了心思。windows
過了幾個月,回到來想一想當初的問題,無非是沒有理解xib的原理,沒有弄清楚在ios裏,若是經過xib來建立對象。xcode
對於xib建立對象,能夠從啓動開始。咱們來看看windows base project的作法和 single view project的作法。iphone
一:對於 window base 的建立步驟:函數
第1步:將建立的xib設置爲啓動frame。這個能夠在 target>>summary>>main interface中設置。ui
這有點至關於將應用的啓動入口設置爲本xib。spa
第2步:這個啓動xib的file owner必定是 UIApplication。但真正的全局AppDelegate是哪一個呢?.net
那就須要你在xib中新建一個Object,而後把類名設置爲您的真正的啓動代理類:xxxx_AppDelegate設計
注意:這裏須要將啓動類綁定到 file owner的delegate。(和UI元素的綁定方法同樣)。代理
咱們再看看main函數:
int retVal = UIApplicationMain(argc, argv,nil, nil);
這裏沒有指定啓動的代理類。我猜測最後一個參數不設置的話,就會從啓動xib中的UIApplication.delegate來指定。
第3步:繼然是window base,那你固然須要在啓動xib中建立一個window。
建立的window與代碼如何對應呢?通常咱們是在 xxxx_AppDelegate中建立一個UIWindow。
而後在xib中將window與代理中的實例鏈接上,而後代碼中就直接用了,和使用一個控件同樣。
這樣,程序一啓動,就建立了一個UIWindow。不須要你寫UIWindow的建立代碼。
第4步:做爲一個UI程序,應該會有界面邏輯,而界面須要包含在UIViewController中,
因此,你能夠在啓動xib中建立UIViewController,繪製你的界面。或者直接關聯別一個nib文件。
固然,你要使用它,仍然須要在xxxx_AppDelegate中聲明UIViewController中的對象viewController,而後在xib中創建鏈接。
注意:這種方式下,UIViewController是自動建立的,不須要你寫建立的代碼。
最後一步:通過上面的動做。在啓動代理的啓動方法didFinishLaunchingWithOptions中添加如下代碼就搞定了。
[window addSubview:viewController.view];
[window makeKeyAndVisible];
按照上面這種方式,咱們的啓動界面沒有使用 alloc來建立任何ui對象,全部ui對象都是經過xib加載時自動生成的。
須要注意的是,這種方式,須要將xib設置爲 main interface。若是您的程序是iphone和ipad適應的,那能夠設置兩個不一樣的啓動xib.
若是在xcode4中要建立 window base project,差很少就上面的套路。靠xib來生成window和viewController.
注:我也見到過沒有設置main interface的程序,而且在main中也沒有設置AppDelegate類。我猜測,默認爲使用MainWindow.xib作爲
啓動Interface。好象書中的hello_world就是這樣的。
二:再看看single view project的建立方式。
第1步:固然,咱們不能設置 main interface。咱們須要看看main函數。在其中設定啓動代理類。
UIApplicationMain(argc, argv,nil, NSStringFromClass([SingViewTest_AppDelegateclass]));
在這裏,第4個參數咱們指定了啓動的AppDelegate,而不是象上面那樣,經過xib來指定啓動代理類。
第2步:在啓動方法中,自行建立window
self.window = [[[UIWindowalloc] initWithFrame:[[UIScreenmainScreen] bounds]] autorelease];
上面的代碼建立一個全屏的窗體,看看,是咱們自已alloc的。
第3步:經過程序來建立 SingelView的viewControoler.
self.viewController = [[[SingViewTest_ViewControlleralloc] initWithNibName:@"SingViewTest_ViewController"bundle:nil]autorelease];
若是您的viewController想經過xib來加載(一般的方式),那就採起上面的方式。
若是您不想使用 UI 設計器,你也能夠
MyViewController *vc = [[ MyViewControlleralloc] init];
固然,這種狀況你須要在viewdidLoad中動態生成您的ui元素。
最後一步:將viewcontroller的ui顯示出來。
self.window.rootViewController =self.viewController;
[self.windowmakeKeyAndVisible];
經過上面兩個工程的建立,能夠看出,ios提供兩個啓動入口的方式。
方式一:指定xib作爲啓動interface,這種方式下,須要自已指定啓動AppDelegate。
能夠經過建立 object,而後改類名,再綁定的方式。
這種方式下,能夠以此爲起點,將真正的啓動window,啓動ViewController在此處建立和鏈接。
對於簡單的應用,咱們還能夠在這個啓動的xib裏,將啓動的ui都畫好。
方式二:在main中指定啓動AppDelegate。
這個須要修改 main函數中 UIApplicationMain方法的最後一個參數。
這種方式下,啓動的windows,viewController須要自已經過alloc來生成,後面的作法和方式一就沒啥區別了。
寫得很亂,主要是加深一下自已的記憶。