昨天参照书中的例子,回到家后开始实现示例中的代码.

发现XCode4.2中没有Window Base Application这一选项.使用Empty Application没有主界面的Storyboard文件.

于是打开google,发现Jeroen Trappers有一篇文章有详细的解决方法.

地址:http://www.trappers.tk/site/2011/06/16/mainwindow-xib/

 

我的看法是(不一定准确):AppDelegate是个代理类,起类似与window编程下的WNDPROC函数.

与其配合的是UIApplication.

在没有XIB文件的情况下,是通过程序的方式加载UIApplication的一个实例完成框架的建立的.

为了从XIB文件中加载,我们就要自己创建一个XIB文件,这是首先的问题.

如何将XIB文件和AppDelegate的类关联是下面的问题.

 

我们知道,AppDelegate需要一个UIApplition实例,这个事例保存所有XIB上元素的拷贝.所以File's Owner的类名我们要改为UIApplicaion

同时UIApplicaion有一个插座IBOutlet刚好是我们AppDelegate可以对接的.类型UIApplicationDelegate

于是我们首先拖放一个Object,修改类名为我们的xAppDelegate,这样就可以将这个Object和UIApplication中的delegate链接了.

delegate

The delegate of the application object.

@property(nonatomic, assign) id<UIApplicationDelegate> delegate

Discussion

The delegate must adopt the UIApplicationDelegate formal protocol. UIApplication assigns and does not retain the delegate.

Availability
  • Available in iOS 2.0 and later.
Declared In
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的类

Start with Empty Application template

2.新建文件,选择User Interface下的Empty 命名为MainWindow

Add Empty Interface Builder document

3.打开新建的MainWindow.xib文件

The empty design surface of MainWindow.xib

 

4.将File's Owner的类名修改为UIApplication

Change class of File's Owner to UIApplication

5. 在Library中拖放一个Object到图下的位置

Add Object to the document

6.将该object的类名修改为文件中AppDelegate的类名(同时还可以给object命名下Label)

Change class of the object to xAppDelegate

7.拖放一个Window到左边

Add a window to the document

8. 在xAppDelegate的h文件中,给window的属性加上IBOutlet

@interface DemoAppDelegate :
      UIResponder <UIApplicationDelegate>
@property (strong, nonatomic) IBOutlet UIWindow *window;
@end

9.将File's Owner 和 拖放的Object按照以下方式连接

Link the application delegate

 

Link the window outlet of the app delegate

 

10.在项目属性中,把Main Interface修改成你的xib文件名MainWindow

Set the Main Interface to MainWindow

11. 在xAppDelegate.m文件中,将

- (BOOL) application:didFinishLaunchingWithOptions:

 

这个方法全部注释掉

 

以上在Lion 10.7.2 XCode4.2中测试通过.