iOS復(fù)數(shù)cell下優(yōu)雅的代碼結(jié)構(gòu)詳解
前言
最近換了新工作,第一個(gè)需求是寫幾個(gè)列表。
簡(jiǎn)單的UITableView+Cell,但畢竟是入職后的第一個(gè)需求感覺要被review,所以還是想盡量弄得優(yōu)雅一點(diǎn)。
下面話不多說(shuō)了,來(lái)一起看看詳細(xì)的介紹吧
需求
一個(gè)頁(yè)面,可能出現(xiàn)多種cell。
這個(gè)需求應(yīng)該是很常見的,需要解決的問題是如何讓多個(gè)cell能夠共同響應(yīng)同一個(gè)方法,這樣外部不需要知道具體的cell種類,只要調(diào)用同一個(gè)方法進(jìn)行配置即可。
問了問朋友們大家基本上是兩派。
- 協(xié)議
- 基類
我個(gè)人以前也是用協(xié)議對(duì)多個(gè)cell進(jìn)行約束的,通過讓cell遵循同一個(gè)協(xié)議并實(shí)現(xiàn)協(xié)議方法,讓外部達(dá)到統(tǒng)一配置的效果。
//cell共同遵循這個(gè)協(xié)議 @protocol ModuleACellConfigPropotol <NSObject> - (void)configCellWithModel:(KTModel *)model; @end 通過協(xié)議調(diào)用方法 UITableViewCell<ModuleACellConfigPropotol> * cell= [tableView dequeueReusableCellWithIdentifier:cellID]; if ([cell respondsToSelector:@selector(configCellWithModel:)]) { [cell configCellWithModel:model]; }
對(duì)于基類繼承,大家普遍反映很惡心,準(zhǔn)備重構(gòu),所以就不考慮了。
耦合
標(biāo)準(zhǔn)的MVC情況下, cell的配置方法,應(yīng)該長(zhǎng)這樣:
@interface KTTableViewCell00 : UITableViewCell - (void)configShowViewWithTitle00:(NSString *)title; @end @interface KTTableViewCell01 : UITableViewCell - (void)configShowViewWithTitle01:(NSString *)title; @end
外部賦值也不應(yīng)該把model傳遞給cell,而是只傳遞cell指定的參數(shù)
[cell configShowViewWithTitle01:model.title];
而協(xié)議,為了達(dá)到統(tǒng)一配置,必須使用同一個(gè)方法進(jìn)行約束。而cell們實(shí)際上的充要參數(shù)并不相同,所以只能將整個(gè)model作為參數(shù)進(jìn)行傳遞。
@protocol ModuleACellConfigPropotol <NSObject> - (void)configCellWithModel:(KTModel *)model; @end
解耦
通過協(xié)議約束的方式,已經(jīng)能夠成功實(shí)現(xiàn)統(tǒng)一配置。
但有一個(gè)問題隨之而來(lái),這樣cell就與model產(chǎn)生了耦合,導(dǎo)致cell無(wú)法復(fù)用。
從結(jié)果上來(lái)看,這樣并不完美。
要解決這個(gè)問題,我覺得在cell與協(xié)議之間,又添加了一層適配器是個(gè)不錯(cuò)的方案。
而這個(gè)適配器,我使用了Category進(jìn)行實(shí)現(xiàn)。
@interface KTTableViewCell00 (ModuleA) <ModuleACellConfigPropotol> @end @implementation KTTableViewCell00 (ModuleA) - (void)configCellWithModel:(KTModel *)model { [self configShowViewWithTitle00:model.title]; } @end
最后調(diào)用起來(lái) :
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { KTModel *model = self.dataArr[indexPath.row]; NSString * cellID = model.identifier; UITableViewCell<ModuleACellConfigPropotol> * cell= [tableView dequeueReusableCellWithIdentifier:cellID]; if ([cell respondsToSelector:@selector(configCellWithModel:)]) { [cell configCellWithModel:model]; } return cell; }
結(jié)尾
人總是不斷成長(zhǎng)的,這個(gè)方案目前是我覺得比較不錯(cuò)的。
如果有大佬愿意指教或者探討,不勝感激
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
ios基于UITableViewController實(shí)現(xiàn)列表
這篇文章主要介紹了ios基于UITableViewController實(shí)現(xiàn)列表的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-01-01iOS快速實(shí)現(xiàn)環(huán)形漸變進(jìn)度條
之前看到很多環(huán)形進(jìn)度條,看上去很酷,然后就試著學(xué)習(xí)他們的代碼,結(jié)果發(fā)現(xiàn)實(shí)現(xiàn)一個(gè)環(huán)形進(jìn)度條一點(diǎn)也不簡(jiǎn)單。我就在想一個(gè)簡(jiǎn)單的進(jìn)度條有這么復(fù)雜嗎?自己摸索后,有一個(gè)簡(jiǎn)單的實(shí)現(xiàn)方法?,F(xiàn)在分享給大家,有需要的朋友們可以參考借鑒。2016-10-10IOS textField限制字節(jié)長(zhǎng)度
這篇文章主要介紹了IOS textField限制字節(jié)長(zhǎng)度的相關(guān)資料,需要的朋友可以參考下2016-02-02iOS App開發(fā)中UITextField組件的常用屬性小結(jié)
這篇文章主要介紹了iOS App開發(fā)中UITextField組件的常用屬性小結(jié),文中還介紹了UITextField隱藏鍵盤及為內(nèi)容增加校驗(yàn)的兩個(gè)使用技巧,需要的朋友可以參考下2016-04-04iOS中時(shí)間與時(shí)間戳的相互轉(zhuǎn)化實(shí)例代碼
這篇文章主要介紹了iOS中時(shí)間與時(shí)間戳的相互轉(zhuǎn)化實(shí)例代碼,非常具有實(shí)用價(jià)值,需要的朋友可以參考下。2017-03-03iOS應(yīng)用開發(fā)中使UITextField實(shí)現(xiàn)placeholder屬性的方法
這篇文章主要介紹了iOS應(yīng)用開發(fā)中使UITextField實(shí)現(xiàn)placeholder屬性的方法,示例代碼為傳統(tǒng)的Objective-C語(yǔ)言,需要的朋友可以參考下2016-04-04