在上一篇文章中我们知道了如何去手动的写一个窗体,写一个默认的Controller并连接MVC这三个模块,在我们了解了之后,我们就能够通过一种方式去创建一个新窗体了,例如当我们希望在主窗体中按一个按钮打开一个新窗体的时候,我们就需要手动的去创建一个新窗体,首先,我们先把MainWindow的界面做成如下图所示。

然后我们再在MainWindowController头文件中写下如下代码,去连接我们的代码和UI。
@interface MainWindowController : UIViewController {
}
@property (retain,nonatomic) IBOutlet UIButton *button;
@end
然后我们在内容文件中写下如下代码。
@synthesize button;
- (IBAction)buttonClicked:(id)sender{
}
我们上面的代码写了一个button控件,然后实现了,然后还写了事件,现在我们只要连接控件ui和事件就可以了。如下图,我们先连接我们的UI到控件(记住按住control),让编译器知道我们这个按钮是我们上面写的button。

连接完之后,我们还需要反向的连接一下,我们按住control,然后从button的事件中,选中Touch Up Inside,然后拖动到Main Window Controller中,然后选中buttonClicked,就连接了按钮的事件。

这样,我们就连接MainWindow和MainWindowController,现在我们就要先创建一个新的窗口,然后再通过这个按钮事件去打开一个新窗口,所以我们先创建一个新窗口并取名叫MyMainWindow。

我们在资源文件中添加一个新的View XIB文件,然后打开这个文件,编写一个基本的UI,如下图。

新的窗口创建好了之后我们就要为新的窗口写Controller文件,例如我们可以创建一个新的类叫MyMainWindowController,记住我们这里一定要创建一个继承自UI的应用类文件并取名叫MyMainWindowController。虽然没有说名字非要取MyMainWindowController,但是这样取名是非常有必要也有好处的,我们能够一眼就知道这个UI是哪个Controller去控制的。

在创建好之后,我们再编辑MyMainWindow,在NIB窗口中,我们打开File’s Owner,然后在类中,选择我们的Controller,如下图。

当打开时,有可能是默认继承自NSObject的,也有可能是MainWindowController,这里我们需要选的是MyMainWindowController,所以上面这个图是没有选择的,我们只需要在Class中选择相应的Controller即可,不过这里优先级不高。
当我们连接好UI和类文件之后,我们就创建了一个新的窗口,但是这里值得注意的有几点。
我们编写多窗口应用和创建View-based应用程序是不同的,我们创建的是Window-based应用程序。
View-based默认创建了一个View并默认连接了,而Window-based默认创建的是应用程序委托(相当于定义了main函数),并连接了。
因为Window-based是应用程序委托,所以要自己写Controller。
Window-based默认的Controller连接的是应用程序委托,所以要创建View的实例,连接Controller。
我们创建的View-based窗口(这里不是程序),不是连接委托,所以直接使用File’s Owner即可连接Controller。
大概了解了这些之后,我们就可以写按钮事件去打开新窗口了,代码如下。
@class MyMainWindowController;
@interface MainWindowController : UIViewController {
IBOutlet UIButton
MyMainWindowController *mywindow;
}
@property (retain,nonatomic) IBOutlet UIButton
*button;@property (retain,nonatomic) MyMainWindowController *mywindow; - (IBAction)buttonClicked:(id)sender;
@end
写完头文件之后,我们还要写实现。
#import "MyMainWindowController.h"
@implementation MainWindowController
@synthesize button;
@synthesize mywindow;
{
MyMainWindowController *controller = [[MyMainWindowController alloc] initWithNibName:@"MyMainWindow" bundle:nil];
if(self.mywindow == nil)
{
self.mywindow = controller;
[self.view addSubview:controller.view];
[controller release];
}
}
写完之后,我们就Build and GO GO GO,然后我们单击按钮,是不是就可以打开新的窗口了?是不是有点晕呼呼的,说实话把,我自己一开始看这东西的时候也觉得很麻烦,其实用会了之后,也不是那么麻烦了。
代码下载
[...] iPhone开发 – 多窗体应用:创建新窗体 [...]