iOS--復(fù)數(shù)cell下優(yōu)雅的的代碼結(jié)構(gòu)

前言

最近換了新工作弄痹,第一個(gè)需求是寫(xiě)幾個(gè)列表肛真。

簡(jiǎn)單的UITableView+Cell蚓让,但畢竟是入職后的第一個(gè)需求感覺(jué)要被review历极,所以還是想盡量弄得優(yōu)雅一點(diǎn)趟卸。


需求

一個(gè)頁(yè)面衰腌,可能出現(xiàn)多種cell右蕊。

這個(gè)需求應(yīng)該是很常見(jiàn)的饶囚,需要解決的問(wèn)題是如何讓多個(gè)cell能夠共同響應(yīng)同一個(gè)方法萝风,這樣外部不需要知道具體的cell種類(lèi)睬塌,只要調(diào)用同一個(gè)方法進(jìn)行配置即可揩晴。

問(wèn)了問(wèn)朋友們大家基本上是兩派硫兰。

  • 協(xié)議

  • 基類(lèi)

我個(gè)人以前也是用協(xié)議對(duì)多個(gè)cell進(jìn)行約束的劫映,通過(guò)讓cell遵循同一個(gè)協(xié)議并實(shí)現(xiàn)協(xié)議方法泳赋,讓外部達(dá)到統(tǒng)一配置的效果。

//cell共同遵循這個(gè)協(xié)議
@protocol ModuleACellConfigPropotol <NSObject>
- (void)configCellWithModel:(KTModel *)model;
@end
?
?
通過(guò)協(xié)議調(diào)用方法
UITableViewCell<ModuleACellConfigPropotol> * cell= [tableView dequeueReusableCellWithIdentifier:cellID];
if ([cell respondsToSelector:@selector(configCellWithModel:)]) {
 [cell configCellWithModel:model];
}

對(duì)于基類(lèi)繼承衅鹿,大家普遍反映很惡心大渤,準(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

解耦

通過(guò)協(xié)議約束的方式,已經(jīng)能夠成功實(shí)現(xiàn)統(tǒng)一配置畔咧。

但有一個(gè)問(wèn)題隨之而來(lái)誓沸,這樣cell就與model產(chǎn)生了耦合宿百,導(dǎo)致cell無(wú)法復(fù)用垦页。

從結(jié)果上來(lái)看痊焊,這樣并不完美宋光。

要解決這個(gè)問(wèn)題,我覺(jué)得在cell與協(xié)議之間赘艳,又添加了一層適配器是個(gè)不錯(cuò)的方案。

而這個(gè)適配器掰曾,我使用了Category進(jìn)行實(shí)現(xiàn)旷坦。

補(bǔ)充一些:
需要注意Category使用過(guò)多,是會(huì)拖慢APP啟動(dòng)時(shí)間的捆蜀。所以除非特殊情況誊薄,不要把他當(dāng)成cell于model解耦的標(biāo)配。
但是這里除了Category該怎么做適配器咐刨,我目前沒(méi)什么好的想法。

@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è)方案目前是我覺(jué)得比較不錯(cuò)的沸久。

如果有大佬愿意指教或者探討,不勝感激

Demo可以自取


后來(lái)的補(bǔ)充

  • 關(guān)于協(xié)議

我和很多朋友討論過(guò),這是個(gè)比較成熟的解決方式担钮。

  • 關(guān)于解耦

我個(gè)人在項(xiàng)目里也不會(huì)把所有的cell和model全部解耦。
太執(zhí)著于非必要的解耦鲤嫡,被條條框框限制死,也不好。

比如一個(gè)model有10個(gè)屬性欺缘,兩個(gè)cell使用這個(gè)model并且其中8個(gè)屬性公用丧鸯。
我很可能會(huì)把model直接丟給cell丛肢,而不是每個(gè)cell單獨(dú)寫(xiě)出一個(gè)方法來(lái)配置。

甚至杠步,這兩個(gè)cell很有可能被我做成子類(lèi)與父類(lèi)的關(guān)系。比如這個(gè):


他們真的太像了,第cell1和cell2甚至作為cell3和4的子類(lèi)存在颠蕴。
他們配置上的唯一區(qū)別就是使用紅點(diǎn)bool紅點(diǎn)num還是不需要紅點(diǎn)寡键。
我實(shí)在不愿意把他們?nèi)齻€(gè)拆成三個(gè)方法

- (void)configcellWithTitle:(NSString *)title content:(NSString *)content dot:(BOOL)dot;
- (void)configcellWithTitle:(NSString *)title content:(NSString *)content dot:(NSString)num;
- (void)configcellWithTitle:(NSString *)title content:(NSString *)content;
  1. 這個(gè)cell被其他模塊的復(fù)用的幾率基本為0
  2. 這個(gè)Model離開(kāi)了這個(gè)Cell也沒(méi)啥地方能用

SO...綁了就綁了唄...他倆本身就是共生的。

所以,解耦這一塊仁者見(jiàn)仁智者見(jiàn)智吧。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末女淑,一起剝皮案震驚了整個(gè)濱河市鸭你,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌瓣窄,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,376評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異映九,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)引有,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,126評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門(mén)曾我,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)抒巢,“玉大人平酿,你說(shuō)我怎么就攤上這事筑辨∧合郑” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,966評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)电媳。 經(jīng)常有香客問(wèn)我,道長(zhǎng)拼缝,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,432評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮穴翩,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘背蟆。我一直安慰自己志珍,他們只是感情好伦糯,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,519評(píng)論 6 385
  • 文/花漫 我一把揭開(kāi)白布淤翔。 她就那樣靜靜地躺著旁壮,像睡著了一般。 火紅的嫁衣襯著肌膚如雪童叠。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,792評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼呢蛤。 笑死,一個(gè)胖子當(dāng)著我的面吹牛励翼,可吹牛的內(nèi)容都是我干的抓狭。 我是一名探鬼主播辐宾,決...
    沈念sama閱讀 38,933評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼敞葛,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了氨肌?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,701評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤贩虾,失蹤者是張志新(化名)和其女友劉穎伊群,沒(méi)想到半個(gè)月后舰始,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,143評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,488評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片斟叼。...
    茶點(diǎn)故事閱讀 38,626評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡绑改,死狀恐怖识腿,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情硝全,我是刑警寧澤伟众,帶...
    沈念sama閱讀 34,292評(píng)論 4 329
  • 正文 年R本政府宣布先紫,位于F島的核電站遮精,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏狸膏。R本人自食惡果不足惜湾戳,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,896評(píng)論 3 313
  • 文/蒙蒙 一拦止、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦元旬、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,742評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至沽翔,卻和暖如春跨蟹,著一層夾襖步出監(jiān)牢的瞬間喷市,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工斤蔓, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留友驮,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,324評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像喳整,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子瞬项,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,494評(píng)論 2 348