您的位置:首页 > 移动开发 > IOS开发

iOS开发学习笔记③ - 视图控制器

2015-03-17 09:59 465 查看

视图控制器

视图控制器是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。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  ios