iOS開(kāi)發(fā)-視圖與視圖控制器生命周期
在MVC模型中,V指view,負(fù)責(zé)用戶界面的顯示、處理用戶輸入,并將輸入傳遞給控制器。C是指ViewController,充當(dāng)模型和視圖之間的中介。控制器接收用戶輸入,處理用戶請(qǐng)求,并將結(jié)果傳遞給視圖以更新顯示。本文詳細(xì)介紹在iOS開(kāi)發(fā)中UIView與UIViewController的生命周期。
UIView 的生命周期
主要包括以下關(guān)鍵階段:
- 初始化 (
initWithFrame:orinitWithCoder:) - 添加到父視圖 (
willMoveToSuperview:ordidMoveToSuperview) - 布局子視圖 (
layoutSubviews) - 繪制 (
drawRect:) - 移除父視圖 (
willMoveFromSuperview:ordidMoveFromSuperview) - 銷毀 (
dealloc)
1. 初始化
initWithFrame:
在代碼中創(chuàng)建視圖時(shí)調(diào)用。
- (instancetype)initWithFrame:(CGRect)frame {
self = [super initWithFrame:frame];
if (self) {
// 自定義初始化
}
return self;
}
initWithCoder:
用于從nib文件或Storyboard中加載視圖。這個(gè)方法會(huì)在視圖從接口構(gòu)建器文件(.xib或.storyboard)解碼時(shí)調(diào)用。參數(shù):NSCoder,用于解碼視圖屬性的解碼器對(duì)象
- (instancetype)initWithCoder:(NSCoder *)coder {
self = [super initWithCoder:coder];
if (self) {
// 自定義初始化
}
return self;
}
2. 添加到父視圖
willMoveToSuperview:
視圖將要被添加到父視圖時(shí)調(diào)用。
- (void)willMoveToSuperview:(UIView *)newSuperview {
[super willMoveToSuperview:newSuperview];
// 自定義代碼
}
didMoveToSuperview
視圖已經(jīng)被添加到父視圖時(shí)調(diào)用。
- (void)didMoveToSuperview {
[super didMoveToSuperview];
// 自定義代碼
}
3. 布局子視圖
layoutSubviews
視圖的布局發(fā)生變化時(shí)調(diào)用,用于調(diào)整子視圖的布局。
- (void)layoutSubviews {
[super layoutSubviews];
// 自定義子視圖布局代碼
}
4. 繪制
drawRect:
視圖需要繪制其內(nèi)容時(shí)調(diào)用。這是自定義繪制代碼的地方。
- (void)drawRect:(CGRect)rect {
// 自定義繪制代碼
}
5. 移除父視圖
willMoveFromSuperview:
視圖將要從父視圖中移除時(shí)調(diào)用。
- (void)willMoveFromSuperview:(UIView *)newSuperview {
[super willMoveFromSuperview:newSuperview];
// 自定義代碼
}
didMoveFromSuperview
視圖已經(jīng)從父視圖中移除時(shí)調(diào)用。
- (void)didMoveFromSuperview {
[super didMoveFromSuperview];
// 自定義代碼
}
6. 銷毀
dealloc
視圖被銷毀時(shí)調(diào)用,用于釋放資源。
- (void)dealloc {
// 釋放資源
}
視圖控制器 (UIViewController) 的生命周期
UIView 與 UIViewController 生命周期的關(guān)系
UIView 的生命周期方法通常在 UIViewController 的生命周期方法中被調(diào)用。例如:
- 在
UIViewController的viewDidLoad方法中,視圖會(huì)被初始化和配置。 - 在
UIViewController的viewWillAppear:方法中,視圖會(huì)被添加到窗口并準(zhǔn)備顯示。 - 在
UIViewController的viewWillDisappear:方法中,視圖會(huì)從窗口中移除。
1. init
init 方法是視圖控制器的初始化方法。通常用來(lái)初始化視圖控制器的狀態(tài),在這里進(jìn)行分配內(nèi)存與初始化實(shí)例變量。
- (instancetype)init {
self = [super init];
if (self) {
// 初始化代碼
}
return self;
}
2. loadView
loadView 方法是用于創(chuàng)建視圖控制器的視圖層次結(jié)構(gòu)的。只有當(dāng)視圖控制器的視圖屬性被訪問(wèn)且為空時(shí),才會(huì)調(diào)用這個(gè)方法。通常不需要手動(dòng)重寫(xiě)這個(gè)方法,除非需要自定義視圖層次結(jié)構(gòu)。
- (void)loadView {
// 創(chuàng)建視圖層次結(jié)構(gòu)
UIView *view = [[UIView alloc] initWithFrame:[UIScreen mainScreen].bounds];
view.backgroundColor = [UIColor whiteColor];
self.view = view;
}
3. viewDidLoad
viewDidLoad 方法在視圖控制器的視圖加載到內(nèi)存后調(diào)用。適合在這里做視圖的進(jìn)一步初始化和配置。通常在這里添加子視圖并設(shè)置其屬性,或者執(zhí)行一次性初始化任務(wù),如設(shè)置標(biāo)簽按鈕等UI組件。
- (void)viewDidLoad {
[super viewDidLoad];
// 視圖加載后的初始化
self.view.backgroundColor = [UIColor whiteColor];
UILabel *label = [[UILabel alloc] initWithFrame:self.view.bounds];
label.text = @"Hello, World!";
label.textAlignment = NSTextAlignmentCenter;
[self.view addSubview:label];
}
4. viewWillAppear:
viewWillAppear: 方法在視圖即將被添加到視圖層次結(jié)構(gòu)中并顯示在屏幕上時(shí)調(diào)用。適合在這里做視圖顯示前的準(zhǔn)備工作,例如更新視圖內(nèi)容。
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
// 視圖即將顯示
}
5. viewDidAppear:
viewDidAppear: 方法在視圖已經(jīng)被添加到視圖層次結(jié)構(gòu)中并顯示在屏幕上時(shí)調(diào)用。適合在這里啟動(dòng)需要在視圖顯示后進(jìn)行的任務(wù),例如動(dòng)畫(huà)和數(shù)據(jù)加載。
- (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
// 視圖已經(jīng)顯示
}
6. viewWillLayoutSubviews
viewWillLayoutSubviews 方法在視圖控制器的視圖即將布局其子視圖時(shí)調(diào)用。適合在這里更新子視圖的布局。
- (void)viewWillLayoutSubviews {
[super viewWillLayoutSubviews];
// 更新子視圖布局
}
7. viewDidLayoutSubviews
viewDidLayoutSubviews 方法在視圖控制器的視圖已經(jīng)布局其子視圖時(shí)調(diào)用。適合在這里做布局完成后的調(diào)整。
- (void)viewDidLayoutSubviews {
[super viewDidLayoutSubviews];
// 布局完成后的調(diào)整
}
8. viewWillDisappear:
viewWillDisappear: 方法在視圖即將從視圖層次結(jié)構(gòu)中移除時(shí)調(diào)用。適合在這里做視圖消失前的清理工作。
- (void)viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
// 視圖即將消失
}
9. viewDidDisappear:
viewDidDisappear: 方法在視圖已經(jīng)從視圖層次結(jié)構(gòu)中移除時(shí)調(diào)用。適合在這里做視圖消失后的清理工作。
- (void)viewDidDisappear:(BOOL)animated {
[super viewDidDisappear:animated];
// 視圖已經(jīng)消失
}
10. dealloc
dealloc 方法在視圖控制器被銷毀時(shí)調(diào)用。適合在這里做資源釋放和清理工作。
- (void)dealloc {
// 釋放資源
}

浙公網(wǎng)安備 33010602011771號(hào)