视图控制器
视图控制器是UIViewController类或其子类的对象。
每个控制器都负责管理一个视图层次结构,包括处理视图相关用户事件,以及将整个视图层次结构添加到应用窗口。
以下以建立一个控制视图A和视图B的控制器为例。
UIViewController的view属性
1、 首先为A,B建立两个UIViewController:ControllerA和ControllerB继承了UIViewController;
ControllA、B从UIViewController中继承了一个重要特性:
@property (nonatomic, strong) UIView *view;
view属性指向一个UIView对象,UIViewController可以管理一个视图层次结构,view就是这个视图层次结构的根视图。
视图控制器可通过两个方式创建视图层次结构:
- 代码方式:覆盖UIViewController中的loadView方法。
- NIB文件方式。
通过代码创建
2、覆盖loadView方法.
#import "ViewA.h"
@implementation ControllerA
- (void)loadView
{
// 创建一个ViewA对象
ViewA *viewA = [[ViewA alloc] init];
//将对象赋给视图控制器的view属性
self.view = viewA;
}
@end
支线:设置根视图控制器
setRootViewController
方法可将视图控制器的层次结构加入应用窗口。
当程序将某个视图控制器设置为UIWindow对象的rootViewController时,UIWindow对象会将该视图控制器的view作为子视图加入窗口,此外,还会自动调整view的大小,将其设置与窗口的大小相同。
AppDelegate.m文件didFinishLaunchingWithOptions方法中:
//建立一个A控制器对象
ControllerA *ca = [[ControllerA alloc] init];
// 设置根视图
self.window.rootViewController = ca;
支线:创建时间提醒示例
IBAction与IBOutlet
IBAction和IBOutlet关键字告诉Xcode,这些属性或方法之后会在Interface Builder中关联。
- IBOutlet修饰的字段可以和InterfaceBuilder里相应控件相关联;
- IBAction修饰的方法可以和InterfaceBuilder里控件的相应动作相关联。
- (IBAction)addReminder:(id)sender
这里的sender是参数名称,理论上可以指代任何对象,具体看方法的定义。
通常情况下,sender常用于传递消息的发送者,可以理解为触发方法的对象。
加载NIB文件
在ControllerA的指定初始化方法中设置需要加载的NIB文件:
(instanceType)initWithNibName:(NSString *) nibName
bundle:(NSBundle *) nibBundle;
该方法包含两个参数,分别是指定NIB文件的文件名以及所在的程序包。
AppDelegate.m文件didFinishLaunchingWithOptions方法中:
// 获取指向NSBundle对象的指针,该NSBundle对象代表应用的主程序包
// 向NSBundle发送mainBundle消息可以得到应用的程序包
NSBundle *appBundle = [NSBundle mainBundle];
//告诉初始化方法在appBundle中查找ControllerB.xib文件
ControllerB *cb = [[ControllerB alloc]initWithNibName:@"ControllerB"
bundle:appBundle];
在运行时关联加载NIB文件的对象,可在XIB文件中关联File’s Owner:
选中大纲视图的File’s Owner,单机监视面板第三个按钮,打开标识监视面板(identity inspector),将class文本框中的内容改为需要关联的视图控制器(本例为ControllerB)。
接下来关联view和可关联的插座变量和方法。
此时可运行程序。
简化加载方法
初始化加载:
ControllerB *cb = [[ControllerB alloc] init];
此方法会加载与ControllerB同名的xib文件。
【轮命名的重要性】
UITabBarController
UITabBarController对象可以保存一组视图控制器。
还会在屏幕底部显示一个标签栏(tab bar),标签栏会有多个标签项(tab item),分别UITabBarController对象所保存的每一个试图控制器。
AppDelegate.m文件didFinishLaunchingWithOptions方法中:
// 创建一个UITabBarController对象
UITabBarController *tabBar = [[UITabBarController alloc] init];
// 将之前创建的两个视图控制器加入该对象
tabBar.viewControllers = @[ca, cb];
// 将UIWindow对象的根视图设置为UITabBarController
self.window.rootViewController = tabBar;
设置标签项的标题和图标
首先将图标文件导入Images.xcassets中。
之后在ControllerA.m文件中覆盖指定初始化方法,设置标签项:
- (instanceType)initWithNibName:(NSString *)nibNameOrNil
bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil
bundle:nibBundleOrNil];
if (self) {
//设置标签的标题
self.tabBarItem.title = @"A";
//从图像文件创建一个UIImage对象
//在Retina显示屏上会加载A@2x.png而不是A.png
UIImage *i = [UIImage imageNamed:@"A.png"];
//将UIImage对象赋给标签项的image属性
self.tabBarItem.image = i;
}
return self;
}
同理设置B的。
添加本地通知 (Local Notification)
首先创建一个UILocalNotification对象并设置显示内容和时间,然后调用UIApplication单例对象的scheduleLocalNotification方式注册。
- (IBAction)addReminder:(id)sender
{
NSDate *date = self.datePicker.date;
NSLog(@"Setting a remainder for %@", date);
UILocalNotification *note = [[UILocalNotification alloc] init];
note.alertBody = @"Hypnotize me!";
note.fireDate = date;
[[UIApplication sharedApplication] scheduleLocalNotification:note];
}
访问视图
通常情况下要在用户看到XIB文件中创建的视图之前,对它们做一些额外的初始化工作。
在以下两个方法中访问XIB文件中的视图:
- 用于确认视图已加载的viewDidLoad,该方法会在视图控制器加载完NIB文件之后被调用。
- viewWillAppear,该方法会在试图控制器的view添加到应用窗口之前被调用。
两个方法的区别是,如果只需要在应用启动后设置一次试图对象,就选择viewDidLoad,如果用户每次看到试图控制器的view时都需要设置,则选择viewWillAppear。