MVC框架模式
MVC即model(模型)、view(視圖)和controller(控制器)的縮寫,是一種軟件設計模式,專用於含有圖形化用戶界面的軟件設計,自20世紀80年代以來已經有30多年的歷史了。雖然年過已久,但是歲月這把殺豬刀似乎並沒有斬殺多少MVC的活力,時至今日,MVC依舊活躍於當今世界的各大框架中,其中就包括眾所周知的QT、MFC、C#&.Net等等,並且在其基礎上,還衍生出“Hierarchical MVC”(HMVC)、“model-view-adapter”(MVA)等新秀模式。
MVC具體指的是:將圖形化軟件切分成model、view和controller共3個部分:
model:負責數據動態管理和軟件業務邏輯,接收來自controller的操作,並將結果及時傳遞給view。
view:直接呈現在用戶面前的信息,比如一張圖片或一段文字。
controller:接收來自用戶的輸入,並轉換成相應的命令交給model。

MVC的優點是:3個部分各司其職、責任明確且耦合性低,很大程度上降低了軟件復雜性,從而提高了軟件的質量以及開發效率。
當我們在用AutoLayout布局我們的UI控件的時候,其實我們就已經在使用MVC的設計方式了。我們今天的主角UIViewController扮演的正是MVC中的controller。話不多說,我們先來簡單認識一下UIViewController
致Android開發者:UIViewController之於iOS如同Activity之於Android,如此形容,想必UIViewController對你來說就沒有什么神秘的了。
響應Button
首先,我們重新創建1個工程“Create a new Xcode project”->“Single View App”->命名工程“Charpter6”

新建工程會默認創建1個UIViewController,且命名為ViewController(如下圖),我們看到ViewController默認生成了2個函數有待我們去完善。
其中didReceiveMemoryWarning用於處理內存告急的警告,以防內存泄漏,我們會在后續的章節對其進行介紹,此處不表。我們盡可將其刪除或置之不理。
另一個函數viewDidLoad是本節的重點,顧名思義,該函數就是用於加載View的。

我們切換到輔助編輯界面,並打開Main.storyboard,然后拖入一個button到storyboard的ViewController的面板上。

然后,我們給Button添加上適當的約束(左/上/右邊距0,高50)

接下來我們要讓Controller和Button產生聯系,使得Controller可以通過代碼來引用、修改和響應Button。
首先是在ViewController中創建Button的引用:
使用“Ctrl-拖拽”(長按Ctrl鍵並長按鼠標左鍵拖拽)Storyboard上的Button到代碼中。

Storyboard上UI控件的引用稱為“Outlet”,即下圖Connection所對應的選項。
Type選擇UIButton,Storage選擇Weak,Name可以任意指定,此處我們命名其為“button”,然后點擊Connect。

這時我們看到ViewController多出1個成員變量:button,而這就是Storyboard上Button的引用,這樣我們就可以通過代碼來修改Button了。

然后是讓ViewController獲取Button的點擊事件:
如法炮制,使用“Ctrl-拖拽”Storyboard上的Button。Storyboard上UI控件的點擊事件稱為“Action”,即下圖Connection所對應的選項。
Type選擇UIButton,Event選擇Touch Up Inside,Storage選擇Weak,Name可以任意指定,此處我們命名其為“buttonAction”,然后點擊Connect。


這時我們看到ViewController多出1個成員量函數:buttonAction,而這就是Storyboard上對應Button的點擊事件響應函數,這樣我們就可以通過代碼來響應Button點擊了。

現在我們想讓Button點擊后,改變其內容,即將“Button”改為“俺菜鳥到此一游”,於是我們在函數buttonAction中添加1行:
button.setTitle("俺菜鳥到此一游", for: .normal)

運行效果如下

總結
通過上面的例子,我們很容易明白UIViewController的工作就是保存UI引用、修改UI、捕獲UI事件等,即扮演着MVC中的“Controller”。而我們利用Storyboard面板布局UI控件即“View”,根據業務邏輯設計和管理數據結構以及管控工作流程就形成了“Model”, 通過對這3者的整合可以很高效的開發出我們想要的軟件。
源碼下載:https://pan.baidu.com/s/1r6ShruXaiKBZugriILVkzQ
