關于代碼風格的一些見解(一)

UIViewController和UIView

Controller顧名思義,主要是用來做控制的,View是用來做UI展示的.但在實際的開發中,往往會將ControllerView都作為UI層來展示,這樣做會有什么問題?

  • View將不光負責展示控件,還需要處理業務數據,業務邏輯.對于一個業務邏輯很強的View這樣做還可以,比如用戶的頭像控件,就是和用戶個人資料有很強業務關系的,這種做法是合理的.但如果是一個普通的View,比如一個底部工具條,里面有很多按鈕,顯然再用View處理業務邏輯和數據是不合理的,這樣的View是沒法復用的,如果你說:我不復用View,那就呵呵了.
  • Controller里面可能存在大量的UI控件,各種創建控件的代碼,各種代理,回調,數據讀取,網絡請求,業務數據適配,這樣的ViewController將會變得非常龐大.ViewController就是一個頁面,一個完整的頁面,要用ViewController就是想用些和生命周期有關的ViewController特有的東西,如果只是通過ViewController加載一個view,那最好直接用view.通常來講ViewController是不能夠復用的,如果你從StoryBoard中連了很多控件到ViewController中,而那個StoryBoard中要是還有很多約束,那隨著業務的發展,這份代碼離無法維護的日子就不遠了.

那Controller應該做什么:

  1. 初始化UI(極少了的UI細節,各種自定義UIView)
  2. addObserver 設置delegate,可能還有addTag,addGesture(極少的)
  3. 同步取本地數據,異步取網絡數據.(UI展示的數據,即使是同步數據也不應該在Controller里初始化),對于數據,這里應該是封裝了的數據,也就是說,一個View對應一個Model,而不應該是零散的數據,拼湊的.
  4. 在代理和observer的回調中更新UI,這里的更新UI只要1句話,把數據全都通過Viewpublic interface 丟給View,至于View想用什么,想怎么更新,都是它自己的事情(這里的View包括自定義的TableViewCell,CollectionViewCell,自定義的View),當然對于部分更新UI還是要在View中暴露幾個public property.
  5. 如果你使用自動布局或者Masonry要手動碼一些addConstraints這樣類似的代碼,或者你使用frame,那你要在viewDidLayoutSubviews設置每個viewframe
  6. 最核心的部分,負責頁面的跳轉,跳轉也就是一句話,[XXXViewController xxx:];這里需要在ViewController里面實現一個或者多個類方法,方便外部調用和傳遞參數,這里參數還是建議封裝成一個model,只傳一個參數,里面具體是什么自己去解析.這里ViewController只關心跳哪里,具體怎么跳,不需要寫在本ViewController里.
  7. 動態展示一些子view,alertView,messageBox, 這里是把ViewController弄亂的最好的地方,因為動態添加的view可能是動畫,所以盡量把view中動畫有關的東西都封裝到view中,ViewController只通過1-2句代碼創建View并完成動畫,而ViewViewController傳遞消息和數據統統都通過代理的方式,最后ViewController只要在某個代理里remove這個view就可以了.
    所以整個ViewController寫下來import的東西應該是類似這樣的
#import "XXXViewController.h"
#import "XXXModel.h"
.....
#import "XXXView.h"
....
#import "XXXViewCell.h"
....

至于從model中獲取的數據不是view要顯示的數據應該怎樣做數據的適配呢?這里就要使用到ViewModel,為避免文章過長,下一篇詳細說明如何在已有的big VC中增加VM來瘦身VC.

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容