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

本文介绍了iOS开发中UIViewController的使用,包括view属性、代码创建视图、设置根视图控制器、时间提醒示例、使用NIB文件加载视图、UITabBarController的使用以及添加本地通知。讲解了IBAction和IBOutlet的关联,以及在不同生命周期方法中访问视图的时机。
摘要由CSDN通过智能技术生成

视图控制器

视图控制器是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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值