iOS 復(fù)雜功能界面開發(fā)小結(jié)

iOS 復(fù)雜功能界面開發(fā)小結(jié)
時間:2017年8月11日 周五
最近一直在做功能開發(fā),在這過程中遇到遇到幾個大的功能,關(guān)于填寫表單的,每個輸入框都有字符串校驗、提示語、錯誤提示語等。

實現(xiàn)的方式有很多,最直接就是采用MVC的模式,簡單粗暴,把所有的數(shù)據(jù)處理、業(yè)務(wù)邏輯等代碼都放到viewController下,這樣會把代碼搞得很復(fù)雜,而且代碼量也是非常大的,不利于后期的代碼維護。
在開發(fā)過程嘗試兩種開發(fā)方式,現(xiàn)在做一個小結(jié)。

方式一:MVC+plist

有個功能是綁定會員卡的,有四個輸入框,采用了MVC模式,再把每個輸入框涉及到的信息做成字典,存儲到一個plist文件中,進入VC的時候,就加載plist文件中的數(shù)據(jù),存儲在數(shù)組中,并把它更新到列表中。當(dāng)有輸入內(nèi)容也是把輸入內(nèi)容存儲到字典對應(yīng)的key中。

字典格式如下:

NSDictionary
type:類型標(biāo)記
keyBoardType:鍵盤類型
info:提示語
text:輸入框中內(nèi)容:默認(rèn)空
placeholder:輸入框中的placeholder
hasError:是否有錯誤
error:錯誤提示語
liftImage:左邊圖片
rightImage:右邊圖片

如下圖:
用了一個cell類型,完成tableview中cell的樣式,
keyBoardType:輸入框的鍵盤類型;
info:對應(yīng)cell中灰色的提示語;
text:對應(yīng)輸入框中的內(nèi)容;
placeholder:輸入框中的placeholder;
error:對應(yīng)cell中紅色提示語、并且分割線為紅色,根據(jù)hasError字典判斷;

DingTalk20170814170707.png

具體流程:
1、進入界面時,完成界面初始化,通過字典字段中的值來控制cell內(nèi)容的顯示,liftImage、rightImage控制cell中圖片的顯示;
2、cell右邊的圖片是按鈕,定義了一個block,觸發(fā)點擊事件時,回調(diào)block,完成相應(yīng)操作,通過字典中的type區(qū)分屬于什么操作;
3、輸入框也定義了相應(yīng)的block,在cell中實現(xiàn)對輸入框字符串長度的控制,通過字典中的type區(qū)分屬于哪個編輯框的操作,并把編輯框的內(nèi)容存儲到字典對應(yīng)的key:text字段中,當(dāng)輸入框輸入內(nèi)容是,顯示上面的灰色標(biāo)題,否則隱藏;
4、當(dāng)點擊確定按鈕時,會校驗每一個字典中的text字典的內(nèi)容,若有錯誤,hasError字段置為YES;沒有錯誤會執(zhí)行下一步動作,有錯誤,則刷新tableView,效果如上面的圖片所示。

優(yōu)點:
1)優(yōu)點就是簡單快速完成數(shù)據(jù)的配置。
缺點:
1)易出錯,通過字典的key來獲取value,同一個key用的地方多的話,修改麻煩,若是不小心寫錯了key,不容易發(fā)現(xiàn)問題;
2)代碼臃腫,很多邏輯判斷劃分在了viewController、cell中;
3)不方便后續(xù)維護,若是不熟悉流程,上手要時間消化;
4)plist文件丟失,xcode不會報錯;

方式二:MVC+viewModel

接下來一個更加復(fù)雜界面的開發(fā),添加乘機人列表功能,分5個section,數(shù)據(jù)量高達20項,有編輯框、選擇列表、提示語,需要根據(jù)外部傳過來的參數(shù)進行界面改動:增加或減少輸入、選擇項。
在分析需求文檔的時候,就把MVC+plist文件這種模式給否定了,因為在測試階段,對代碼、功能優(yōu)化的時候,發(fā)現(xiàn)不是很靈活,也不利于功能的擴展。重新構(gòu)建了處理數(shù)據(jù)的方式增加一個ViewModel屬性。
M:表單數(shù)據(jù)模型;
V:view,界面元素;
C:viewController,控制器,實現(xiàn)view的展示,數(shù)據(jù)跟view的對接,用戶交互;
viewModel:完成對數(shù)據(jù)的處理,數(shù)據(jù)模型的初始化,界面元素的控制,數(shù)據(jù)校驗,提示語、錯誤提示語等;

viewModel的結(jié)構(gòu)

1)在.m文件中定義了所有要用到的元素的常量,一個元素對應(yīng)一個常量,使用的時候直接根據(jù)常量名稱來定位操作的,這樣避免了直接對字符串的操作。
static NSString *const kSectionBasic = @"Basic";//這對應(yīng)一個section
static NSString *const kRowBrithDate = @"BirthDate";//生日,默認(rèn)今天//這個對應(yīng)一個cell

2)兩個關(guān)鍵屬性
@property (nonatomic, strong) NSMutableArray *sectionKeys;//section,存儲kSection類型的常量;
@property (nonatomic, strong) NSMutableDictionary *sectionRowsDict;//section對應(yīng)的cell,用section作為key,用數(shù)組存儲對應(yīng)的row值,存儲kRow類型的常量
根據(jù)外部傳遞過來的參數(shù),相應(yīng)的調(diào)整sectionKeys、sectionRowsDict的內(nèi)容,更新tableView的時候,就是通過這些值來控制tableView中的元素顯示,有個幾section、section下有個row。
3)能在viewModel中實現(xiàn)數(shù)據(jù)操作的就在.m文件中實現(xiàn),在.h中聲明方法給外部調(diào)用,避免直接對數(shù)據(jù)的操作。例如,提供cell需要的信息,text、info、error、圖片;校驗數(shù)據(jù)正確與否;哪些數(shù)據(jù)有錯誤;根據(jù)輸入內(nèi)容、點擊事件,更新數(shù)據(jù);數(shù)據(jù)初始化,等等。也就是說,viewController需要什么數(shù)據(jù),都是從viewModel拿到數(shù)據(jù),然后提供給View。

具體流程:

1、通過viewModel完成數(shù)據(jù)模型的初始化,完成界面的初始化,由viewModel來控制哪個些需要展示,哪些不要顯示,有沒有錯誤提示語;
2、cell的樣式跟上面的圖片展示cell類似,只是沒有左側(cè)的圖片,其他的功能都有;
3、刷新tableView的時候,向viewModel傳遞indexPath,viewModel根據(jù)它獲取指定的數(shù)據(jù);
1)是否有圖片,有則展示它;
2)從viewModel獲取placeholder、text、info、errorInfo,傳遞給cell,在cell內(nèi)部完成相應(yīng)的操作;
3)cell右側(cè)圖標(biāo)點擊事件、編輯框輸入事件,都是通過block將內(nèi)容回調(diào)給viewController,點擊事件的執(zhí)行在viewController完成,輸入內(nèi)容由viewModel來處理;
4、點擊確定按鈕,viewModel完成數(shù)據(jù)校驗,有錯誤則展示錯誤提示語,并滾動到第一條錯誤的地方;沒有則執(zhí)行下一步。

優(yōu)點:
1)這樣做的優(yōu)點就是大大的縮減了viewcontroller中的代碼量,讓它看起來不會那么的龐大,便于閱讀代碼,但不要天真的認(rèn)為總的代碼量會減少,只是把一大部分代碼移植到viewModel中,實際上總的代碼量是增加的。(此外還跟程序員寫的代碼質(zhì)量有很大的關(guān)系)
2)便于后期的維護;
缺點:
構(gòu)建viewModel的前期工作量比較大的,需要構(gòu)建的方法多,會造成一定程度的代碼混亂,要做好相關(guān)的代碼注釋、mark標(biāo)記;

綁定會員卡,采用了MVC+plist模式,以為使用它會比較方便完成功能的實現(xiàn)。一開始確實如此,很快就實現(xiàn)了,但是后面需求加了各種的條件后維護起來就顯得有點力不從心了,需要去搜索是不是有哪些地方都用到了這個key,這key有沒有寫出字符,折騰起來挺考驗人的。
添加乘機人,采用了MVC+viewModel模式,一開是開發(fā)量是比較大的,但是維護起來就方便多了。

總結(jié):

不管是MVC、MVC+plist,還是MVC+viewModel,目的是實現(xiàn)這個功能,只是代碼表現(xiàn)形式不一樣罷了,可以抽離的地方就是數(shù)據(jù)操作這一塊,把數(shù)據(jù)操作劃分給各個部分,讓每個部分承擔(dān)一部分?jǐn)?shù)據(jù)的操作,以降低數(shù)據(jù)操作在viewController的集中程度。
MVC+plist:plist,實現(xiàn)了數(shù)據(jù)的初始化部分、實現(xiàn)了數(shù)據(jù)封裝形式、數(shù)據(jù)存儲形式。不用plist文件,可不可以?當(dāng)然是完全可以的,完全可以在viewcontroller內(nèi)部,自己定義數(shù)據(jù)封裝形式。
MVC+viewModel:viewModel,抽離出來的數(shù)據(jù)操作程度更高而已。

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

推薦閱讀更多精彩內(nèi)容

  • 2017.02.22 可以練習(xí),每當(dāng)這個時候,腦袋就犯困,我這腦袋真是神奇呀,一說讓你做事情,你就犯困,你可不要太...
    Carden閱讀 1,368評論 0 1
  • 前言 由于最近兩個多月,筆者正和小伙伴們忙于對公司新項目的開發(fā),筆者主要負(fù)責(zé)項目整體架構(gòu)的搭建以及功能模塊的分工。...
    CoderMikeHe閱讀 27,087評論 74 271
  • iOS網(wǎng)絡(luò)架構(gòu)討論梳理整理中。。。 其實如果沒有APIManager這一層是沒法使用delegate的,畢竟多個單...
    yhtang閱讀 5,237評論 1 23
  • 問題: 昨天剛剛把《究竟為何在人世》讀了第二遍,今天和一個家長聊天,恰好就談到了孩子的人生使命。 我們的一...
    skierr閱讀 1,486評論 0 48
  • 開心,感受到了久違的放松。沒有掩飾,沒有太多偽裝。只是單純的追求開心和快樂。我們的友誼在這個夜晚得到了最好的詮釋。...
    周旭東閱讀 149評論 0 0