網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
iOS ViewController
寫UIKit的代碼, ViewController是離不開的. 本文試圖講講它的基本知識(shí), 不是很深入且有點(diǎn)雜亂, 供初級(jí)選手和跨技術(shù)棧同學(xué)參考.
What is a View Controller
iOS中的View Controller非常像Android中的Activity.
它負(fù)責(zé)用戶界面的展示, 有一些生命周期的回調(diào)函數(shù), 還和界面切換有關(guān), 一個(gè)app中可以有一個(gè)或多個(gè)ViewController.
每一個(gè)ViewController都有一個(gè)single root view, 包含此ViewController的所有內(nèi)容, 在頁(yè)面上的所有View都會(huì)被加入到以這個(gè)root view為根的樹形結(jié)構(gòu)中去.
ViewController有一個(gè)view
屬性, 代表最后返回的頁(yè)面.
ViewController擁有所有的View, 管理和這些View相關(guān)的交互, 是離用戶最近的第一層代碼.
如何定義ViewController.
一般要繼承UIViewController
.
如果你的頁(yè)面主要是tableview或者collectionview也可以繼承UITableViewController
或 UICollectionViewController
.
ViewController的類型
ViewController的類型有兩種:
- Content view controller: 管理一塊view的內(nèi)容. (大多數(shù)的ViewController都是這一種.)
- Container view controller: 作為一個(gè)container, 管理其中的child view controllers. 把每個(gè)child view controller的root view顯示在container的view范圍內(nèi). 可以每次只展示一個(gè)child, 也可以多個(gè)同時(shí)展示. UIKit中的
UINavigationController
,UITabBarController
,UISplitViewController
,UIPageViewController
都是這種類型, 它們多數(shù)是為了不同界面之間的導(dǎo)航服務(wù)的.
生命周期回調(diào)
Controller的回調(diào)中最常用的是:
-
loadView()
: 用來設(shè)置根view屬性, add views等. -
viewDidLoad()
, 可以用來做一些初始化的工作, 比如加載數(shù)據(jù), add和remove views, 設(shè)置constraints等.
其他的回調(diào)方法名字也非常直白:
- viewWillAppear(): view繪制之前.
- viewDidAppear(): view繪制出來了.
- viewWillDisappear(): view馬上要消失了.
- viewDidDisappear(): 已經(jīng)消失了.
ViewController的職責(zé)
ViewController即MVC(Model View Controller)模式中的Controller.
如何管理View和數(shù)據(jù)的分離和交互是開發(fā)者自己的職責(zé).
在簡(jiǎn)單的demo里, 如果你愿意, 一個(gè)ViewController就可以寫完所有代碼.
和Android一樣, 我們會(huì)盡量把邏輯從ViewController(Activity)中拆分出去, 寫出更加職責(zé)分明并且容易被測(cè)試的代碼.
會(huì)有一些流行的模式, 比如MVVM什么的, 這里不展開講了.
Scene, Window, ViewController
每一個(gè)Window都有一個(gè)root view controller, 是window最開始的內(nèi)容.
展示一個(gè)新的view controller將會(huì)改變窗口內(nèi)容.
它們之間的關(guān)系如圖:
圖片來源
總結(jié)
iOS中的View Controller作為MVC模式中的Controller, 可以類比Android中的Activity:
- view屬性返回頁(yè)面內(nèi)容.
- 有一些生命周期回調(diào).
- 有一些各種各樣的pattern為了讓它承擔(dān)的職責(zé)盡量得少.
(其實(shí)后端代碼提供API的第一層也叫Controller, 所以有沒有可能, 最開始設(shè)計(jì)UIKit的人是一個(gè)之前寫后端的?)
References
- ViewController Programming Guide for iOS
- Managing content in your app’s windows
- UIViewController
原文鏈接:https://juejin.cn/post/7153277627065696293
相關(guān)推薦
- 2022-10-28 MPAndroidChart繪制自定義運(yùn)動(dòng)數(shù)據(jù)圖表示例詳解_Android
- 2024-03-07 MyBatis多表映射
- 2022-09-16 Golang實(shí)現(xiàn)Biginteger大數(shù)計(jì)算實(shí)例詳解_Golang
- 2022-10-30 淺析pytest?鉤子函數(shù)?之初始鉤子和引導(dǎo)鉤子_python
- 2023-05-11 Oracle刪除數(shù)據(jù)非常慢的問題及解決_oracle
- 2022-07-19 react表單處理之 非受控組件
- 2022-10-29 編寫字符設(shè)備驅(qū)動(dòng)控制樹莓派io口
- 2022-09-16 windows?dos命令解除端口占用的問題_DOS/BAT
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支