昨天參照書中的例子,回到家後開始實現示例中的代碼.html
發現XCode4.2中沒有Window Base Application這一選項.使用Empty Application沒有主界面的Storyboard文件.ios
因而打開google,發現Jeroen Trappers有一篇文章有詳細的解決方法.編程
地址:http://www.trappers.tk/site/2011/06/16/mainwindow-xib/app
個人見解是(不必定準確):AppDelegate是個代理類,起相似與window編程下的WNDPROC函數.框架
與其配合的是UIApplication.函數
在沒有XIB文件的狀況下,是經過程序的方式加載UIApplication的一個實例完成框架的創建的.學習
爲了從XIB文件中加載,咱們就要本身建立一個XIB文件,這是首先的問題.測試
如何將XIB文件和AppDelegate的類關聯是下面的問題.ui
咱們知道,AppDelegate須要一個UIApplition實例,這個事例保存全部XIB上元素的拷貝.因此File's Owner的類名咱們要改成UIApplicaiongoogle
同時UIApplicaion有一個插座IBOutlet恰好是咱們AppDelegate能夠對接的.類型UIApplicationDelegate
因而咱們首先拖放一個Object,修改類名爲咱們的xAppDelegate,這樣就能夠將這個Object和UIApplication中的delegate連接了.
The delegate of the application object.
@property(nonatomic, assign) id<UIApplicationDelegate> delegate
DiscussionThe delegate must adopt the UIApplicationDelegate
formal protocol. UIApplication
assigns and does not retain the delegate.
UIApplication.h
源文件中有UIWindow的變量 window ,咱們須要在上面添加的Object(類名xAppDelegate)裏面建立一個Window,而後把變量加上IBOutlet後進行連接.
這樣就完成了XIB中AppDelegate和它下面Window的兩個對象從XIB到代碼之間的連接.
但是此時程序的入口並無改變,文章中推薦的方式是在工程配置中的Main Interface修改成一個XIB文件名,其實就是在程序中加載XIB文件做爲入口.
一樣的功能,也許咱們在代碼中也能夠實現.相似與initWithNibName的方法,暫時我沒有實現.
還有就是註釋掉了一個初始化的函數:- (BOOL) application:didFinishLaunchingWithOptions: 這個方法中的操做是跟咱們從XIB加載相沖突的.
經過以上幾個步驟,咱們就能夠從Empty Application中自定義的加載一個XIB文件了.
學習到這裏,讓我對整個XIB的工做方式和UIApplication的工做原理又有了更深一步的瞭解.
對於之後的多視圖學習很是的有幫助.
以上操做的詳細步驟以下,順便複習一下:
1.建立Empty application,此時項目中只有一個AppDelegate的類
2.新建文件,選擇User Interface下的Empty 命名爲MainWindow
3.打開新建的MainWindow.xib文件
4.將File's Owner的類名修改成UIApplication
5. 在Library中拖放一個Object到圖下的位置
6.將該object的類名修改成文件中AppDelegate的類名(同時還能夠給object命名下Label)
7.拖放一個Window到左邊
8. 在xAppDelegate的h文件中,給window的屬性加上IBOutlet
@interface DemoAppDelegate : UIResponder <UIApplicationDelegate> @property (strong, nonatomic) IBOutlet UIWindow *window; @end
9.將File's Owner 和 拖放的Object按照如下方式鏈接
10.在項目屬性中,把Main Interface修改爲你的xib文件名MainWindow
11. 在xAppDelegate.m文件中,將
- (BOOL) application:didFinishLaunchingWithOptions:
這個方法所有註釋掉
以上在Lion 10.7.2 XCode4.2中測試經過.