当我们想开发基于多窗体的应用程序的时候,我们就需要使用多窗体的应用程序模板去开发,当然,这个时候我们就要去自己写一些窗体的应用开发了,所以在写多窗体应用程序开发的时候,我们首先要手动的去写一个窗体,于是我们就要创建一个Window-Based应用程序。我们按照下图创建一个Window-Based应用程序,并命名叫Window。

创建完成后我们可以看到系统给我们创建的模板的东西很少,就只有一个WindowAppDelegate.h和WindowAppDelegate.m,这两个文件,由于前面我们说了iPhone是基于MVC模型开发的,所以在这里,我们的Delegate委托只是用于调用一个Controller而已,例如前面的项目中MainWindow调用了HelloWorldController一样,只是不同的是现在我们要自己写Controller。不过,在自己写之前,我们还要更改委托类的代码。我们首先添加一个Controller,我们就命名为MainWindowController。
![]()

创建好之后,我们就可以在代码中更改如下代码了,我们可以给.h和.m代码分别更改如下(加粗为更改的代码)。
@class MainWindowController;
@interface WindowAppDelegate : NSObject
<UIApplicationDelegate> {UIWindow *window;
IBOutlet MainWindowController *mainWindow;
}
@property (nonatomic, retain) IBOutlet UIWindow
*window;@property (nonatomic, retain) IBOutlet MainWindowController *mainWindow;
@end
然后编写实现的类,代码如下。
#import "MainWindowController.h"
@implementation WindowAppDelegate
@synthesize window;
@synthesize mainWindow;
// Override point for customization after application launch
[window addSubview:mainWindow.view];
[window makeKeyAndVisible];
} - (void)dealloc {
[mainWindow release];
[window release];
[super dealloc];
}
@end
这样,在开始主程序的时候会通过MainWindowController打开窗体,现在,我们要连接MainWindow.xib到我们的MainWindowController。首先我们打开MainWindowController,我们可以看到一个主窗口,打开之后我们需要为主窗口增加一个View,我们可以双击下面的View Controller图标,创建一个类似灰色图形区域的View实例。

双击上面的View控制器添加,如果双击不起作用,可以关闭当前Interface Builder然后再打开,双击后可以看到如下图所示的窗口。

当我们创建好之后,可以在身份检查器中看到该View的类的定义,而且也可以看到MainWindow.xib的控制窗体中增加了一个Main Window Controller图标,我们可以点击上面的View,也可以点击图标,然后在类定义中选择我们刚才创建的类MainWindowController,如下图所示。

更改了类名称之后,就是告诉MainWindow.lib连接MainWindowController这个类,这样这个UI就知道如何去使用类了。
这里还需要指出的是,我们这里添加了一个View的实例到MainWindow,然后更改了View这个实例的类的连接,所以我们只需要在MainWindowController下面去更改任何代码,即可以实现我们想要的效果了,如添加事件等等。我们可以看到我们的控制窗口如下。

我们右键点击File’s Owner,可以看到File’s Owner是连接自WindowAppDelegate的,而新的Main Window Controller才是我们真正需要连接的类,这里可能有点难以理解,但是必须要理解这个地方。和前面的基于View的应用程序不同,主窗体是通过AppDelegate去启动的,启动之后,我们创建了View的实例并连接到了View的类(Controller)。所以Main Window Controller才是我们的Controller对象,和单独的View的窗体不同,这点我会在后面再解释。
在连接了之后,我们还需要将deletegate连接到Main Window Controller,我们只需要按住Control然后将Window App Delegate拖到Main Window Controller即可,如下操作。

在小的灰色窗口中我们选择mainWindow,也就是我们在WindowAppDelegate中写的MainWindowController的实例,可以看前面的代码段。这样我们就连接了UI,MainWindowController和AppDelegate了,是不是感觉很难理解?确实,我自己也觉得有点难理解。
连接好之后,我们运行应用程序,就会发现,打开的窗口就是我们新写的View的实例了,在开发中,我们就为我们的MainWindow写了一个MainWindowController并连接了,这样就可以使用MainWindowController去更改我们的MainWindow的UI和相应的事件了。
总结这个步骤:
- 创建Window-based应用程序。
- 创建MainWindowController。
- 更改AppDelegate代码,引用MainWindowController。
- 打开MainWindow.lib,并增加一个新View的实例。
- 更改新View的Class。
- 连接Delegate到新View。
通过上面几个步骤,我们就编写了主窗口。
在编写了主窗口之后,我们才能考虑如何去编写多窗体的应用程序。
示例代码
[...] iPhone开发 – 多窗体应用:编写主窗体 [...]