swift開發,關于應用、頁面、視圖的生命周期

目錄

      • 一、應用生命周期(App Lifecycle)
        • UIKit (AppDelegate)
        • SwiftUI (使用 ScenePhase)
      • 二、頁面生命周期(ViewController Lifecycle)
      • 三、視圖生命周期(UIView Lifecycle)
      • 四、SwiftUI 視圖生命周期
      • 五、關鍵對比總結

在 Swift 開發中,應用、頁面(視圖控制器)和視圖的生命周期是核心概念。以下是 iOS 開發中(UIKit 和 SwiftUI)的生命周期詳解:


一、應用生命周期(App Lifecycle)

通過 AppDelegate 或 SwiftUI 的 App 協議管理應用級事件:

UIKit (AppDelegate)
class AppDelegate: UIResponder, UIApplicationDelegate {// 應用啟動完成func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {print("App Launched")return true}// 應用進入前臺func applicationDidBecomeActive(_ application: UIApplication) {print("App Active")}// 應用進入后臺func applicationDidEnterBackground(_ application: UIApplication) {print("App Background")}// 應用即將終止func applicationWillTerminate(_ application: UIApplication) {print("App Terminated")}
}
SwiftUI (使用 ScenePhase)
@main
struct MyApp: App {@Environment(\.scenePhase) var scenePhasevar body: some Scene {WindowGroup {ContentView()}.onChange(of: scenePhase) { newPhase inswitch newPhase {case .active: print("App Active")case .inactive: print("App Inactive")case .background: print("App Background")@unknown default: break}}}
}

二、頁面生命周期(ViewController Lifecycle)

UIKit 的UIViewController生命周期(每個方法都需調用 super):

方法調用時機
init(coder:)/ init(nibName:bundle:)控制器初始化
loadView()創建視圖層次結構(不要手動調用)
viewDidLoad()視圖加載完成(只調用一次)
viewWillAppear(_:)視圖即將顯示(每次進入頁面時調用)
viewWillLayoutSubviews()視圖即將布局子視圖
viewDidLayoutSubviews()視圖已完成子視圖布局
viewDidAppear(_:)視圖已顯示
viewWillDisappear(_:)視圖即將消失
viewDidDisappear(_:)視圖已消失
deinit控制器銷毀

示例代碼:

class ViewController: UIViewController {override func viewDidLoad() {super.viewDidLoad()print("View Loaded")}override func viewWillAppear(_ animated: Bool) {super.viewWillAppear(animated)print("View Will Appear")}override func viewDidDisappear(_ animated: Bool) {super.viewDidDisappear(animated)print("View Disappeared")}deinit {print("ViewController Deallocated")}
}

三、視圖生命周期(UIView Lifecycle)

UIKit 的UIView關鍵方法

方法調用時機
init(frame:) / init(coder:)視圖初始化
didAddSubview(_:)子視圖被添加
willRemoveSubview(_:)子視圖將被移除
willMove(toSuperview:)即將添加到父視圖
didMoveToSuperview()已添加到父視圖
layoutSubviews()布局子視圖(布局變更時調用)
draw(_:)需要重繪內容(避免手動調用)
removeFromSuperview()從父視圖移除
deinit視圖銷毀

示例代碼:

class CustomView: UIView {override func layoutSubviews() {super.layoutSubviews()print("Layout Subviews (e.g., frame changed)")}deinit {print("View Deallocated")}
}

四、SwiftUI 視圖生命周期

SwiftUI 使用聲明式語法,通過修飾符響應事件:

修飾符作用
.onAppear { }視圖出現時調用(類似 viewDidAppear
.onDisappear { }視圖消失時調用(類似 viewDidDisappear
.task { }異步任務啟動,視圖消失時自動取消
.onChange(of: value) { }狀態變化時響應

示例代碼:

struct ContentView: View {@State private var text = "Hello"var body: some View {Text(text).onAppear {print("SwiftUI View Appeared")// 初始化數據}.onDisappear {print("SwiftUI View Disappeared")}.task {// 異步加載數據await loadData()}.onChange(of: text) { newValue inprint("Text changed to \(newValue)")}}
}

五、關鍵對比總結

概念UIKitSwiftUI
應用啟動application(_:didFinishLaunching...)App協議 + onChange(of: scenePhase)
頁面顯示/隱藏viewWillAppear
/viewDidAppear
.onAppear
/.onDisappear
布局更新layoutSubviews()自動響應狀態變化
異步任務手動管理(需在 viewDidDisappear取消).task自動取消
銷毀deinit結構體自動釋放

📌 最佳實踐

  • UIKit:在 viewDidLoad 中初始化數據,在 viewWillAppear 中刷新 UI。
  • SwiftUI:用 .onAppear 替代 viewDidLoad + viewWillAppear,用 .task 處理異步。
  • 避免在 layoutSubviews() 中做耗時操作(可能頻繁調用)。

掌握這些生命周期可避免內存泄漏、優化性能并確保正確的數據加載時機。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/90476.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/90476.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/90476.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

借助HarmonyOS SDK,《NBA巔峰對決》實現“分鐘級啟動”到“秒級進場”

《NBA巔峰對決》是由望塵科技推出的國內首個真實還原5V5王朝模式的操作籃球手游,提供流暢操作手感和真實籃球賽場體驗。豐富的玩法在為玩家帶來高質游戲體驗的同時,間接帶來了啟動流程冗長的問題,資源更新階段的等待感尤為突出。 “我們發現&…

HT-LINK ICE:海速芯32Gbps信號調理芯片,40dB補償+國產自主,打破高速互聯瓶頸!

HT-LINK ICE(TENX海速芯)產品解析與推廣文案一、產品定位HT-LINK ICE是TENX海速芯推出的高速信號調理芯片,專為PCIe 5.0/6.0、USB4、Thunderbolt等超高速接口設計,提供信號完整性增強和時鐘恢復功能,適用于數據中心、A…

深入剖析 ADL:C++ 中的依賴查找機制及其編譯錯誤案例分析

一、ADL 的定義與背景(一)ADL 的定義ADL(Argument-Dependent Lookup,依賴查找)是 C 中一種特殊的名稱查找機制,用于在調用函數時,根據函數參數的類型來確定查找的命名空間范圍。ADL 的核心思想是…

【科研繪圖系列】R語言繪制相關系數圖

文章目錄 介紹加載R包數據下載導入數據數據預處理畫圖系統信息參考介紹 【科研繪圖系列】R語言繪制相關系數圖 加載R包 library(vegan) library(dplyr)# install.packages("./RVisulizationData/003.mantel test/ggcor_0.9.8.1.tar.gz", repos = NULL, type = &quo…

pharokka phold--快速噬菌體注釋工具

pharokka是一款專用于噬菌體基因組及宏基因組的快速標準化注釋工具。PS.仍在積極更新中,最近一次更新是在今年6.20。 若需對細菌基因組進行快速標準化注釋,建議使用Bakta。啟發pharokka開發及命名的Prokka也是優秀選擇,但Bakta實為Prokka的卓…

深入淺出 Python Asynchronous I/O:從 asyncio 入門到實戰

在現代軟件開發中,性能是一個永恒的話題。特別是在處理網絡請求、文件讀寫等 I/O 密集型任務時,傳統的同步編程模型可能會因為等待而浪費大量時間。為了解決這個問題,異步編程應運而生。Python 通過內置的 asyncio 庫,為開發者提供…

OpenCV顏色矩哈希算法------cv::img_hash::ColorMomentHash

操作系統:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 編程語言:C11 算法描述 該類實現了顏色矩哈希算法(Color Moment Hash),用于圖像相似性比較。它基于圖像在HSV顏色空間中的顏色矩統計特…

上海交大醫學院張維拓老師赴同濟醫院做R語言訓練營培訓

當前,醫學與人工智能的深度融合正迎來歷史性發展機遇。華中科技大學同濟醫學院附屬同濟醫院(以下簡稱“同濟醫院”)作為醫療人工智能應用的先行探索者,已在電子病歷輔助書寫、科研數據分析、醫療合同自動化審核等關鍵場景完成試點…

使用阿里云/騰訊云安裝完成mysql使用不了

顯示錯誤1130 - Host 106.228.110.117 is not allowed to connect to this MySQL server解決方案進入服務器的mysql命令行mysql -u root -p查看數據庫SHOW DATABASES;選擇mysql數據庫USE mysql;查看里面的表SHOW TABLES;查詢user表格的權限限制SELECT Host, User FROM user;將權…

第35周—————糖尿病預測模型優化探索

目錄 目錄 前言 1.檢查GPU 2.查看數據 ?編輯 3.劃分數據集 4.創建模型與編譯訓練 5.編譯及訓練模型 6.結果可視化 7.總結 前言 🍨 本文為🔗365天深度學習訓練營中的學習記錄博客 🍖 原作者:K同學啊 1.檢查GPU import torch.n…

接口(上篇)

接口(上篇)1.概念2.語法規則3.使用和特性4.實現多接口5.接口間繼承1.概念 接口就是公共的行為規范標準,大家在實現時, 只要符合規范標準,就可以通用。 在Java中,接口可以看成是:多個類的公共規…

UE5 源碼編譯setup.bat報錯

文章目錄編譯報錯改動說明小結更新編譯報錯 改動說明 因為需要整服務器,就編譯源碼,然后就遇到這個,很無語。這個問題一直存在,UE官方也不修復,也算是修復了,只是每次都要去重新下載替換下。也可以去問問d…

Linux下PCIe子系統(二)——PCIe子系統框架詳解

Linux下PCIe子系統(二)——PCIe子系統框架詳解 1. 概述 PCIe(PCI Express)子系統是Linux內核中負責管理PCI/PCIe設備的核心組件。它提供了一套完整的框架來發現、配置和管理PCI設備,實現了設備的即插即用和熱插拔功能。…

[特殊字符] LLM(大型語言模型):智能時代的語言引擎與通用推理基座

本文由「大千AI助手」原創發布,專注用真話講AI,回歸技術本質。拒絕神話或妖魔化。搜索「大千AI助手」關注我,一起撕掉過度包裝,學習真實的AI技術! 從千億參數到人類認知的AI革命 🔍 一、核心定義與核心特征…

18-C#改變形參內容

C#改變形參內容 1.ref 參數 int A100; add1(ref A) public int add1 (ref int x) {x x 10;return x; }2.out 參數 int A100; int B200; int Z; add3(A,B, out Z) public int add3 (int x,int y,int z) {z x y;return z; }

恒盾C#混淆加密大師最新版本1.4.0更新 - 增強各類加密效果, 提升兼容性, 使.NET加密更簡單

C#/.NET作為托管語言, 其編譯生成的EXE/DLL極易被反編譯工具還原源碼。據統計,大量的商業軟件曾遭遇過代碼逆向風險,導致核心算法泄露、授權被跳過. 因此對于C#語言開發的.NET程序來說, 在發布前進行混淆和加密非常有必要. 恒盾C#混淆加密大師作為一款.N…

數學建模:非線性規劃:二次規劃問題

一、定義如果規劃模型的目標函數是決策向量的二次函數,約束條件都是線性的,那么這個模型稱為二次規劃(QP)模型。二次規劃模型的一般形式為二、性質凸性判定準則二次規劃問題的凸性完全由Hessian矩陣H決定:??嚴格凸QP…

4. 那在詳細說一下 http 2.0 的特點

總結 二進制協議:文本通信改為二進制幀通信,數據可以劃分為更小的幀,便于高效解析和傳輸。多路復用:廢除 pipeline 管道,避免了“隊頭阻塞”問題。允許同一個 TCP 連接同時發送多個請求和協議,提高網絡資源…

Qt中遍歷QMap的多種方法及性能分析

Qt中遍歷QMap的多種方法及性能分析遍歷QMap的方法**1、使用迭代器&#xff08;STL風格&#xff09;****2、使用Java風格迭代器****3、使用C11范圍循環****4、使用鍵值分離遍歷**性能分析使用建議遍歷QMap的方法 1、使用迭代器&#xff08;STL風格&#xff09; QMap<QStrin…

Unity3D物理引擎性能優化策略

前言 在Unity3D中優化物理引擎性能&#xff0c;尤其是處理3D碰撞器與2D碰撞器的映射問題&#xff0c;需要結合系統特性和最佳實踐。以下是關鍵策略和實現方案&#xff1a; 對惹&#xff0c;這里有一個游戲開發交流小組&#xff0c;希望大家可以點擊進來一起交流一下開發經驗呀…