当前位置: 代码迷 >> 综合 >> UI篇:ViewController
  详细解决方案

UI篇:ViewController

热度:5   发布时间:2023-12-15 21:25:26.0

1 介绍View Controller(视图控制器)

1.1 MVC模型

MVC是模型(Model)、视图(View)和控制器(Controller)的缩写。

三者的关系:

  1. 视图(view):用户看到的和直接操作的界面。它只接受用户操作,并把数据输出。视图和程序的代码逻辑是彼此独立的,它们之间有明显的界限。
  2. 模型(Model):是应用程序的主体。模型为视图提供数据,应用于模型的代码只需要写一次就可以被多个视图重用减少了代码的重复性。
  3. 控制(Controller):控制器接受用户的输入并调用模型和视图去完成用户的需求,控制器本身不输入任何东西和做任何处理。他只接收用户请求并决定调用哪个模型去处理请求,然后再确定用那个视图来显示返回的数据。

iPhone中的MVC:

  1. 视图:窗口、控件和其他用户可以看到并能与之交互的元素。
  2. 控制器:控制器主要通过委托、时间和通知来实现。
  3. 模型:保存应用程序数据的类。

1.2 View Controller(视图控制器)

View Controller是视图控制器,在iOS对应的类是UIViewController。

ViewController分为两类:

  1. 展示内容:这种ViewController主要用于展示内容,并于用户进行交互。
  2. 用于控制和显示其他ViewController:如UINAvigationController(导航视图控制器)和UITabbarController(选项卡栏控制器)

1.2.1 UIViewController的函数

1.didReceiveMemoryWarning

当程序收到内存警告的时候会出发此函数,在这个函数里面可以自己手动释放一些内存。从iOS3.0开始,这个函数就不是必须要重载的了,可以把释放内存的代码放到ViewDidunload中

2.initWithNibName

这是一个初始化函数,表示从nib文件中初始化视图控制器。在ViewController.m中找不到这个方法的实现,打开AppDelegate.m看到如下代码:

-(BOOL)...didFinishLaunchingWithOption...{...self.viewController=[[[ViewController alloc] initWithNibName:@"ViewController bundle:nil"] autorelease];...
}

在程序初始化运行的时候会调用didFinishLaunchingWithOption这个函数。在上面的代码中,先从ViewController.xib中创建一个ViewControll对象,加载到程序的主视图(window)上。

? initWithNibName的第一个参数表示加载的nib文件名称第二个表示查找nib文件的范围,传nil就可以。如果想要重写initWithNibName,可以在ViewController.m中添加如下代码:

-(void)initWithNibName:(NSString *)nibNameOrNil bundle:(NSString *)nibBundleOrNil{if(self=[super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]){//自定义操作}return self;
}

3.viewDidLoad

当从nib创建的第一个视图的时候,如果重写了控制父类UIViewController中的ViewDidLoad方法,系统会调用此函数。Interface Builder中可以实现界面设计的绝大部分工作,不过依然可以在viewDidLoad中做一些额外的操作。

4.ViewDidUnload

在该方法中将所有IBOutlet变量置为nil,系统zaishifangView的时候就会自动把变量释放掉。

一般在该方法中释放其他view有关的对象、其他在运行时创建的对象、在viewDidLoad中被创建的对象和缓存数据等。

注:当出现内存警告的时候,系统会去调用正在显示的ViewController的父类的ViewDidUnloa的方法,而非当前正在显示的ViewController的ViewController的ViewDidUnload方法。

在此函数中释放内存有个原则:被release的对象必须是很容易被重新创建的对象(比如在viewDiLoad或其他方法中创建的对象),不要release用户数据或其它很难被重新创建的对象。

5.viewWillAppear

view(视图)即将可见时调用这个函数,而且只有试图加载到主窗口上时才调用。

6.shouldAutorotateToInterfaceOrientation

此函数用于设置是否支持屏幕旋转

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation{//YES则支持翻转,NO则不支持。return (interfaceOrientation==UIInterfaceOrientationPortrait);//系统默认不支持旋转功能
}

7.dealloc

当前viewController被释放的时候可以在此函数中清空所有当前的实体和数据,该方法也是自动调用的,无需手动执行。viewDidUnload和dealloc的区别在于:viewDidUnload是程序中的所有的ViewController同时执行,当前正在显示的viewController不执行;dealloc只是当前viewController执行。

-(void)dealloc{[super dealloc];
}

注:父类内存也要释放。所以不要忘记调用[super dealloc];

1.3 生命周期

+(void)initialize;//类的初始化方法
-(instancetype)init;//对象初始化方法
-(instancetype)initWithCoder:(NSCoder *)coder;//从归档初始化
-(void)loadView;//加载视图
-(void)viewDidLoad;//将要加载视图
-(void)viewWillLayoutSubviews;//将要布局子视图
-(void)viewDidLayoutSubviews;//已经布局子视图
-(void)didReceiveMemoryWarning;//内存警告
-(void)viewDidAppear:(BOOL)animated;//已经展示
-(void)viewWillAppear:(BOOL)animated;//将要展示
-(void)viewWillDisappear:(BOOL)animated;//将要消失
-(void)viewDidDisappear:(BOOL)animated;//已经消失
-(void)dealloc;//被释放

以下将ViewCOntroller简写VC

1.创建VC

可以直接手写代码生成或通过XIB生成一个UIViewController。

2.VC初始化

当访问VC的view属性时,view如果此时是nil,那么VC会自动调用**loadView**方法来初始化一个UIView并赋值给view属性。

当VC的view对象载入内存后调用**viewDidLoad**方法,用于对view进行额外的初始化操作。

3.VC将要显示

当程序开始即将要显示VC的可视化部分视图,调用**viewWillAppear**方法

4.VC已经显示

当程序开始即将要显示VC的可视化部分视图,调用**viewDidAppear**方法

5.VC将要消失

view即将从supperView中移除,移除动画切换之后调用**viewWillDisappear**方法,此时已调用removeFromSuperview。

6.VC已经消失

view从superView中移除,移除动画切换之后调用**viewDidDisappear**方法,此时已调用removeFromSuperview。

7.VC被销毁

VC里的所有视图全部移除之后会调用**dealloc**方法。

8.内存警告

如果本视图不是当前屏幕上正在显示的视图,将调用**viewDidUnload方法,其所有子视图将被销毁,同时释放内存。因此当这个视图再次显示在屏幕上的时候,viewDidLoad**方法将会被再次调用,重新生成布局,重复上面所有的步骤。