iOS開發-檢視與檢視控制器生命週期

机械心發表於2024-06-30

在MVC模型中,V指view,負責使用者介面的顯示、處理使用者輸入,並將輸入傳遞給控制器。C是指ViewController,充當模型和檢視之間的中介。控制器接收使用者輸入,處理使用者請求,並將結果傳遞給檢視以更新顯示。本文詳細介紹在iOS開發中UIView與UIViewController的生命週期。

UIView 的生命週期

主要包括以下關鍵階段:

  1. 初始化 (initWithFrame: or initWithCoder:)
  2. 新增到父檢視 (willMoveToSuperview: or didMoveToSuperview)
  3. 佈局子檢視 (layoutSubviews)
  4. 繪製 (drawRect:)
  5. 移除父檢視 (willMoveFromSuperview: or didMoveFromSuperview)
  6. 銷燬 (dealloc)

1. 初始化

initWithFrame:

在程式碼中建立檢視時呼叫。

- (instancetype)initWithFrame:(CGRect)frame {
    self = [super initWithFrame:frame];
    if (self) {
        // 自定義初始化
    }
    return self;
}
initWithCoder:

用於從nib檔案或Storyboard中載入檢視。這個方法會在檢視從介面構建器檔案(.xib或.storyboard)解碼時呼叫。引數:NSCoder,用於解碼檢視屬性的解碼器物件

- (instancetype)initWithCoder:(NSCoder *)coder {
    self = [super initWithCoder:coder];
    if (self) {
        // 自定義初始化
    }
    return self;
}

2. 新增到父檢視

willMoveToSuperview:

檢視將要被新增到父檢視時呼叫。

- (void)willMoveToSuperview:(UIView *)newSuperview {
    [super willMoveToSuperview:newSuperview];
    // 自定義程式碼
}
didMoveToSuperview

檢視已經被新增到父檢視時呼叫。

- (void)didMoveToSuperview {
    [super didMoveToSuperview];
    // 自定義程式碼
}

3. 佈局子檢視

layoutSubviews

檢視的佈局發生變化時呼叫,用於調整子檢視的佈局。

- (void)layoutSubviews {
    [super layoutSubviews];
    // 自定義子檢視佈局程式碼
}

4. 繪製

drawRect:

檢視需要繪製其內容時呼叫。這是自定義繪製程式碼的地方。

- (void)drawRect:(CGRect)rect {
    // 自定義繪製程式碼
}

5. 移除父檢視

willMoveFromSuperview:

檢視將要從父檢視中移除時呼叫。

- (void)willMoveFromSuperview:(UIView *)newSuperview {
    [super willMoveFromSuperview:newSuperview];
    // 自定義程式碼
}
didMoveFromSuperview

檢視已經從父檢視中移除時呼叫。

- (void)didMoveFromSuperview {
    [super didMoveFromSuperview];
    // 自定義程式碼
}

6. 銷燬

dealloc

檢視被銷燬時呼叫,用於釋放資源。

- (void)dealloc {
    // 釋放資源
}

檢視控制器 (UIViewController) 的生命週期

UIView 與 UIViewController 生命週期的關係

UIView 的生命週期方法通常在 UIViewController 的生命週期方法中被呼叫。例如:

  • UIViewControllerviewDidLoad 方法中,檢視會被初始化和配置。
  • UIViewControllerviewWillAppear: 方法中,檢視會被新增到視窗並準備顯示。
  • UIViewControllerviewWillDisappear: 方法中,檢視會從視窗中移除。

1. init

init 方法是檢視控制器的初始化方法。通常用來初始化檢視控制器的狀態,在這裡進行分配記憶體與初始化例項變數。

- (instancetype)init {
    self = [super init];
    if (self) {
        // 初始化程式碼
    }
    return self;
}

2. loadView

loadView 方法是用於建立檢視控制器的檢視層次結構的。只有當檢視控制器的檢視屬性被訪問且為空時,才會呼叫這個方法。通常不需要手動重寫這個方法,除非需要自定義檢視層次結構。

- (void)loadView {
    // 建立檢視層次結構
    UIView *view = [[UIView alloc] initWithFrame:[UIScreen mainScreen].bounds];
    view.backgroundColor = [UIColor whiteColor];
    self.view = view;
}

3. viewDidLoad

viewDidLoad 方法在檢視控制器的檢視載入到記憶體後呼叫。適合在這裡做檢視的進一步初始化和配置。通常在這裡新增子檢視並設定其屬性,或者執行一次性初始化任務,如設定標籤按鈕等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: 方法在檢視即將被新增到檢視層次結構中並顯示在螢幕上時呼叫。適合在這裡做檢視顯示前的準備工作,例如更新檢視內容。

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    // 檢視即將顯示
}

5. viewDidAppear:

viewDidAppear: 方法在檢視已經被新增到檢視層次結構中並顯示在螢幕上時呼叫。適合在這裡啟動需要在檢視顯示後進行的任務,例如動畫和資料載入。

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    // 檢視已經顯示
}

6. viewWillLayoutSubviews

viewWillLayoutSubviews 方法在檢視控制器的檢視即將佈局其子檢視時呼叫。適合在這裡更新子檢視的佈局。

- (void)viewWillLayoutSubviews {
    [super viewWillLayoutSubviews];
    // 更新子檢視佈局
}

7. viewDidLayoutSubviews

viewDidLayoutSubviews 方法在檢視控制器的檢視已經佈局其子檢視時呼叫。適合在這裡做佈局完成後的調整。

- (void)viewDidLayoutSubviews {
    [super viewDidLayoutSubviews];
    // 佈局完成後的調整
}

8. viewWillDisappear:

viewWillDisappear: 方法在檢視即將從檢視層次結構中移除時呼叫。適合在這裡做檢視消失前的清理工作。

- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
    // 檢視即將消失
}

9. viewDidDisappear:

viewDidDisappear: 方法在檢視已經從檢視層次結構中移除時呼叫。適合在這裡做檢視消失後的清理工作。

- (void)viewDidDisappear:(BOOL)animated {
    [super viewDidDisappear:animated];
    // 檢視已經消失
}

10. dealloc

dealloc 方法在檢視控制器被銷燬時呼叫。適合在這裡做資源釋放和清理工作。

- (void)dealloc {
    // 釋放資源
}

參考:

  • https://www.cnblogs.com/CoderWayne/p/3868535.html

相關文章