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