一个IBOutlet是在XIB文件中定义的一项内容与在类中声明的一个变量之间的连接。要将某个字段指定为IBOutlet,只需在类的头文件中,在字段声明的前面加上关键字IBOutlet即可。还可以通过Interface Builder创建IBOutlet。图2-17显示了如何在Interface Builder中创建一个IBOutlet。
图2-17 在Interface Builder中创建一个IBOutlet
我们可以在图2-17中看到在Interface Builder中创建一个IBOutlet的步骤。首先要注意的是,右侧的视图被拆分为Interface Builder和代码窗口。按快捷键command+option+return可启用此拆分视图。要创建IBOutlet,首先右击要创建IBOutlet的对象(A),示例中是Portrait Holder View。在弹出的对话框中,使用鼠标将New Referencing Outlet(B)右方的小圆点拖曳至右侧代码中要创建IBOutlet的位置(C)。在图2-17中,已经创建了一些IBOutlet引用。注意,这些IBOutlet引用都在ViewController.h头文件中创建。我们要使用的ViewController_iPhone和ViewController_iPad将继承该文件。程序清单2-5中显示了ViewControler.h的全部内容。
程序清单2-5 ViewController.h
#import <UIKit/UIKit.h>
#import "RockPaperScissorsController.h"
@interface ViewController : UIViewController{
IBOutlet UIView *landscapeView;
IBOutlet UIView *landscapeHolderView;
IBOutlet UIView *portraitView;
IBOutlet UIView *portraitHolderView;
IBOutlet RockPaperScissorsController *rockPaperScissorsController;
}
@end
在程序清单2-5中可以看到,共有5个IBOutlet引用。这使得我们可通过编程方式在运行时访问这些内容。Interface Builder在创建这些引用的同时,还会在ViewController的实现文件中添加一些清理代码。程序清单2-6显示了这些自动生成的代码。
程序清单2-6 ViewController.m(部分)
- (void)viewDidUnload
{
[landscapeView release];
landscapeView = nil;
[landscapeHolderView release];
landscapeHolderView = nil;
[portraitView release];
portraitView = nil;
[portraitHolderView release];
portraitHolderView = nil;
[rockPaperScissorsController release];
rockPaperScissorsController = nil;
[super viewDidUnload];
// Release any retained subviews of the main view.
// e.g. self.myOutlet = nil;
}
///...
- (void)dealloc {
[landscapeView release];
[landscapeHolderView release];
[portraitView release];
[portraitHolderView release];
[rockPaperScissorsController release];
[super dealloc];
}
在程序清单2-6中可以看到Interface Builder为创建的每个IBOutlet生成的代码。在任务viewDidUnload中,可以看到每个视图均被释放并且被设置为nil。同样,在任务dealloc中,可以看到每个视图同样被释放。下一节将讨论如何响应方向的变化,编写代码根据当前的屏幕方向获取不同的视图。