對于UIViewController
瘦身是一個老生常談的問題此改,現(xiàn)在也有比較多的架構(gòu)來實現(xiàn)此效果,比如MVVM等等。不過這次我們是對于傳統(tǒng)的MVC架構(gòu)設(shè)計實現(xiàn)完美的瘦身茅姜。此方法也完全不妨礙在此基礎(chǔ)上使用MVVM等其他方法瘦身狸相。
情景
首先讓我們看一下我們要做的界面效果
看著界面不是很難薛匪,最上邊是二維碼掃描;中間輸入一些信息脓鹃,數(shù)字1逸尖、2、3是按鈕點擊網(wǎng)絡(luò)請求然后彈出選擇界面供用戶選擇瘸右;最下邊歷史數(shù)據(jù)娇跟。
其實寫下來交互非常的多,接口非常多太颤,業(yè)務(wù)邏輯也非常的復(fù)雜苞俘,
傳統(tǒng)MVC下來整個.h文件估計至少1500行以上。
瘦身思路
通過上圖中的兩根紅色實現(xiàn)龄章,我們將此界面劃分成三部分吃谣。則聲明四個UIViewController
:
分別為:
-
ScanViewController
掃描功能 -
InfoInputViewController
輸入信息 -
HistoryViewController
歷史數(shù)據(jù) -
MyViewController
組裝功能
在MyViewController
中我們進行組裝,并處理一些非業(yè)務(wù)事件
self.myScanVC = [[ScanViewController alloc] init];
[self addChildViewController:self.myScanVC];
[self.view addSubview:self.myScanVC.view];
[self.myScanVC didMoveToParentViewController:self];
self.myInforInputVC = [[InfoInputViewController alloc] init];
[self addChildViewController:self.myInforInputVC];
[self.view addSubview:self.myInforInputVC.view];
[self.myInforInputVC didMoveToParentViewController:self];
self.myHistoryVC = [[HistoryViewController alloc] init];
[self addChildViewController:self.myHistoryVC];
[self.view addSubview:self.myHistoryVC.view];
[self.myHistoryVC didMoveToParentViewController:self];
通過此方法做裙,我們第一步已經(jīng)成功降低了耦合度岗憋,而且在項目中還有更大的一個優(yōu)點就是ScanViewController
和HistoryViewController
兩個類可以達到復(fù)用的效果,其他功能也需要這兩個功能锚贱,所有的業(yè)務(wù)邏輯全部在InfoInputViewController
中
由于InfoInputViewController
中也有非常多的業(yè)務(wù)邏輯而且以按鈕點擊之后開始響應(yīng)為主仔戈。
現(xiàn)在看一下我們的點擊事件有多簡潔:
- (IBAction)actionClick:(UIButton *)sender {
[self.view endEditing:YES];
[self.actionsContext doActionWithLevel:sender.tag];
}
是的沒有任何判斷,而且我們把所有的業(yè)務(wù)邏輯均封裝在了一個一個的Action中拧廊。
下午是我們類結(jié)構(gòu)的設(shè)計
以上設(shè)計思路其實我有單獨寫過《設(shè)計模式之感悟和實踐(二)》
具體代碼文章中也有监徘。
通過此方法既消除了if...else的判斷,同時每個點擊時間的業(yè)務(wù)邏輯也就行了單獨的封裝吧碾。
通過以上兩個方法的結(jié)合成功了將“UIViewController”瘦的簡直不能再瘦了;丝!