昨天参照书中的例子,回到家后开始实现示例中的代码.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中测试经过.