IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> 【iOS】ViewController的生命周期 -> 正文阅读

[移动开发]【iOS】ViewController的生命周期

认识ViewController

ViewController是iOS中一种常见的类,也是MVC中的C控制器。
按结构可对iOS中原生的ViewController分成两个类:

  1. 用于展示内容的ViewController,这种ViewController主要作用是向用户展示内容,并实现用户交互的功能。例如: UITableViewControllerUIViewController
  2. 用于控制和显示其它ViewController的ViewController,这种ViewController一般都是一个ViewController的容器。例如:UINavigationControllerUITabbarController 它们都有一个属性: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];
    // Do any additional setup after loading the view.
    
    [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销毁。

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2022-09-21 00:40:22  更:2022-09-21 00:42:29 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 5:20:22-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码