认识ViewController
ViewController是iOS中一种常见的类,也是MVC中的C控制器。 按结构可对iOS中原生的ViewController分成两个类:
- 用于展示内容的ViewController,这种ViewController主要作用是向用户展示内容,并实现用户交互的功能。例如: UITableViewController、UIViewController
- 用于控制和显示其它ViewController的ViewController,这种ViewController一般都是一个ViewController的容器。例如:UINavigationController 、UITabbarController 它们都有一个属性:viewControllers。其中UINavigationController表示一种Stack式结构,push或pop一个ViewController,后一个ViewController会依赖前一个ViewController。而UITabbarController表示一个Array结构,各个ViewController是并列存在的。
ViewController的生命周期:
探究ViewController的生命周期,是从这些加载ViewController时涉及的方法来切入的:
- (void) awakeFromNib
当一个ViewController被创建,会先判断这个ViewController是否是由xib或storyboard创建的,如果是,那么就会调用该方法,此时nib文件中已经连线好的对象已经完成初始化,frame位置已经固定。
-(void) loadView
当我们新创建一个ViewController,调用该方法来创建ViewController的view。一般情况下,这个方法在同一个ViewController的生命周期中只会被调用一次。
-(void) viewDidLoad
在view加载之后被调用,如果是在代码中创建的视图加载器,他将会在loadView方法后被调用,如果是从nib视图页面输出,他将会在视图设置好后被调用,只会被调用一次,之后进入这个ViewController不调用该方法。
- (void) viewWillAppear: (BOOL)animated
视图即将显示时调用,通知视图控制器其视图即将添加到视图层次结构中。
-(void) viewWillLayoutSubViews
通知视图控制器其视图已将其子视图布局好。值得一提的是,在这个方法里一般都是需要重置view的frame,宽度和高度的获取,所以设置view的frame一般写在这个方法里。
-(void) viewDidLayoutSubViews
通知视图控制器其视图已将其子视图布局好了。
-(void) viewDidAppear: (BOOL)animated
通知视图控制器其视图已将添加到视图层次结构中。
-(void) viewWillDisappear: (BOOL)animated
通知视图控制器其视图将要从视图层次结构中删除。
-(void) viewDidDisappear: (BOOL)animated
通知视图控制器其视图已经从视图层次结构中删除。
- (void) didReceiveMemoryWarning
当应用收到内存警告时会调用该方法
示例求证:
ViewController.h
#import <UIKit/UIKit.h>
@interface ViewController : UIViewController
@end
ViewController.m
#import "ViewController.h"
#import "SecondViewController.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
[super viewDidLoad];
self.view.backgroundColor = [UIColor cyanColor];
UIButton *presentButton = [UIButton buttonWithType:UIButtonTypeSystem];
presentButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
[presentButton addTarget:self action:@selector(present:) forControlEvents:UIControlEventTouchUpInside];
[presentButton setTitle:@"跳转" forState:UIControlStateNormal];
presentButton.frame = CGRectMake(150, 300, 100, 100);
presentButton.titleLabel.font = [UIFont systemFontOfSize:20];
[self.view addSubview:presentButton];
}
- (void)present:(UIButton *)button {
SecondViewController *secondViewController = [[SecondViewController alloc] init];
secondViewController.modalPresentationStyle = UIModalPresentationFullScreen;
[self presentViewController:secondViewController animated:YES completion:nil];
}
@end
SecondViewController.h
#import <UIKit/UIKit.h>
NS_ASSUME_NONNULL_BEGIN
@interface SecondViewController : UIViewController
@property(nonatomic, strong)UIButton *dismissButton;
@end
NS_ASSUME_NONNULL_END
SecondViewController.m
#import "SecondViewController.h"
@interface SecondViewController ()
@end
@implementation SecondViewController
- (void)loadView {
[super loadView];
NSLog(@"loadView!");
}
- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = [UIColor whiteColor];
_dismissButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
[_dismissButton addTarget:self action:@selector(dismiss:) forControlEvents:UIControlEventTouchUpInside];
[_dismissButton setTitle:@"返回上一级" forState:UIControlStateNormal];
_dismissButton.frame = CGRectMake(150, 300, 100, 100);
_dismissButton.titleLabel.font = [UIFont systemFontOfSize:20];
[self.view addSubview:_dismissButton];
NSLog(@"---SecondViewController viewDidLoad---");
}
- (void)viewWillLayoutSubviews {
NSLog(@"viewWillLayoutSubviews!");
}
- (void)viewDidLayoutSubviews {
NSLog(@"viewDidLayoutSubviews!");
}
- (void)viewWillAppear:(BOOL)animated {
NSLog(@"viewWillAppear!");
}
- (void)viewDidAppear:(BOOL)animated {
NSLog(@"viewDidAppear!");
}
- (void)viewWillDisappear:(BOOL)animated {
NSLog(@"viewWillDisappear!");
}
- (void)viewDidDisappear:(BOOL)animated {
NSLog(@"viewDidDisappear!");
}
- (void)didReceiveMemoryWarning {
NSLog(@"didReceiveMemoryWarning!") ;
}
- (void)dismiss:(UIButton*)button {
[self dismissViewControllerAnimated:YES completion:nil];
}
@end
点击按钮进入下一界面: 运行结果: 此时SecondViewController没有消失,当点击返回上一级时,会dismissViewController: 然后结果:
多出来两条打印信息如图所示, 可见调用了viewWillDisappear和viewDidDisappear方法,将SecondViewController销毁。
|