UIViewController和UIView
Controller
顧名思義,主要是用來做控制的,View
是用來做UI展示的.但在實際的開發(fā)中,往往會將Controller
和View
都作為UI層來展示,這樣做會有什么問題?
-
View
將不光負(fù)責(zé)展示控件,還需要處理業(yè)務(wù)數(shù)據(jù),業(yè)務(wù)邏輯.對于一個業(yè)務(wù)邏輯很強(qiáng)的View
這樣做還可以,比如用戶的頭像控件,就是和用戶個人資料有很強(qiáng)業(yè)務(wù)關(guān)系的,這種做法是合理的.但如果是一個普通的View
,比如一個底部工具條,里面有很多按鈕,顯然再用View
處理業(yè)務(wù)邏輯和數(shù)據(jù)是不合理的,這樣的View
是沒法復(fù)用的,如果你說:我不復(fù)用View
,那就呵呵了. -
Controller
里面可能存在大量的UI控件,各種創(chuàng)建控件的代碼,各種代理,回調(diào),數(shù)據(jù)讀取,網(wǎng)絡(luò)請求,業(yè)務(wù)數(shù)據(jù)適配,這樣的ViewController
將會變得非常龐大.ViewController
就是一個頁面,一個完整的頁面,要用ViewController
就是想用些和生命周期有關(guān)的ViewController
特有的東西,如果只是通過ViewController
加載一個view
,那最好直接用view
.通常來講ViewController
是不能夠復(fù)用的,如果你從StoryBoard
中連了很多控件到ViewController
中,而那個StoryBoard
中要是還有很多約束,那隨著業(yè)務(wù)的發(fā)展,這份代碼離無法維護(hù)的日子就不遠(yuǎn)了.
那Controller應(yīng)該做什么:
- 初始化UI(極少了的UI細(xì)節(jié),各種自定義UIView)
-
addObserver
設(shè)置delegate
,可能還有addTag
,addGesture
(極少的) - 同步取本地數(shù)據(jù),異步取網(wǎng)絡(luò)數(shù)據(jù).(UI展示的數(shù)據(jù),即使是同步數(shù)據(jù)也不應(yīng)該在
Controller
里初始化),對于數(shù)據(jù),這里應(yīng)該是封裝了的數(shù)據(jù),也就是說,一個View
對應(yīng)一個Model
,而不應(yīng)該是零散的數(shù)據(jù),拼湊的. - 在代理和
observer
的回調(diào)中更新UI,這里的更新UI只要1句話,把數(shù)據(jù)全都通過View
的public interface
丟給View
,至于View
想用什么,想怎么更新,都是它自己的事情(這里的View
包括自定義的TableViewCell
,CollectionViewCell
,自定義的View
),當(dāng)然對于部分更新UI還是要在View
中暴露幾個public property
. - 如果你使用自動布局或者
Masonry
要手動碼一些addConstraints
這樣類似的代碼,或者你使用frame
,那你要在viewDidLayoutSubviews
設(shè)置每個view
的frame
- 最核心的部分,負(fù)責(zé)頁面的跳轉(zhuǎn),跳轉(zhuǎn)也就是一句話,
[XXXViewController xxx:]
;這里需要在ViewController
里面實現(xiàn)一個或者多個類方法,方便外部調(diào)用和傳遞參數(shù),這里參數(shù)還是建議封裝成一個model
,只傳一個參數(shù),里面具體是什么自己去解析.這里ViewController
只關(guān)心跳哪里,具體怎么跳,不需要寫在本ViewController
里. - 動態(tài)展示一些子
view,alertView,messageBox
, 這里是把ViewController
弄亂的最好的地方,因為動態(tài)添加的view
可能是動畫,所以盡量把view中動畫有關(guān)的東西都封裝到view
中,ViewController
只通過1-2句代碼創(chuàng)建View
并完成動畫,而View
給ViewController
傳遞消息和數(shù)據(jù)統(tǒng)統(tǒng)都通過代理的方式,最后ViewController
只要在某個代理里remove
這個view
就可以了.
所以整個ViewController
寫下來import
的東西應(yīng)該是類似這樣的
#import "XXXViewController.h"
#import "XXXModel.h"
.....
#import "XXXView.h"
....
#import "XXXViewCell.h"
....
至于從model
中獲取的數(shù)據(jù)不是view
要顯示的數(shù)據(jù)應(yīng)該怎樣做數(shù)據(jù)的適配呢?這里就要使用到ViewModel
,為避免文章過長,下一篇詳細(xì)說明如何在已有的big VC
中增加VM
來瘦身VC
.