国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > iOS > 正文

iOS如何讓tableview支持不同種類的cell詳解

2020-07-26 02:44:15
字體:
來源:轉載
供稿:網友

前言

我們在項目中偶爾需要讓tableview里支持不同種類的cell,比如微博的原創微博和別人轉發的微博,就是兩種cell。又或是類似支付寶的的timeline也有各種類型的cell。在同一個tableview里實現不同種類的cell,一般有兩種方法,一種是把所有種類的cell先注冊了,再根據不同的identifer去加載cell,一種是在init時創建不同的identifer的cell。

效果圖如下:


準備工作

創建一個基類的CDZBaseCell,基類cell擁有一些共用的屬性和方法,如持有model,解析model。

創建不同的子類cell,以兩個子類CDZTypeACell CDZTypeBCell 為例,繼承自CDZBaseCell,重寫一些方法,如高度,顯示視圖等等。

Datasource中準備好判斷index所在的cell種類的方法(如根據model的type屬性等)

- (Class)cellClassAtIndexPath:(NSIndexPath *)indexPath{ CDZTableviewItem *item = [self itemAtIndexPath:indexPath]; switch (item.type) {  case typeA:{   return [CDZTypeACell class];  }   break;  case typeB:{   return [CDZTypeBCell class];  }   break; }}- (CDZTableviewItem *)itemAtIndexPath:(NSIndexPath *)indexPath{ return self.itemsArray[indexPath.row];}- (NSString *)cellIdentiferAtIndexPath:(NSIndexPath *)indexPath{ return NSStringFromClass([self cellClassAtIndexPath:indexPath]);}

方法一:先注冊,根據identifer去加載不同的cell

先在tableview創建時注冊需要的不同種類,再判斷index對應的種類,再根據identifer加載子類cell。

[self.tableview registerClass:[CDZTypeACell class] forCellReuseIdentifier:NSStringFromClass([CDZTypeBCell class])];[self.tableView registerClass:[CDZTypeBCell class] forCellReuseIdentifier:NSStringFromClass([CDZTypeBCell class])];

并在- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath中根據重用標識加載cell。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ CDZBaseCell *cell = [tableView dequeueReusableCellWithIdentifier:[self cellIdentiferAtIndexPath:indexPath] forIndexPath:indexPath]; cell.item = [self itemAtIndexPath:indexPath]; return cell;}

方法二:在init時創建不同identifer的cell

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath中判斷cell是否為nil,并根據index所在cell的種類初始化cell和其identifer。

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ CDZBaseCell *cell = [tableView dequeueReusableCellWithIdentifier:[self cellIdentiferAtIndexPath:indexPath]]; if (!cell) {  Class cls = [self cellClassAtIndexPath:indexPath];  cell = [[cls alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:[self cellIdentiferAtIndexPath:indexPath]]; } cell.item = [self itemAtIndexPath:indexPath]; return cell;}

源碼下載

所有源碼和Demo(本地下載)

總結

個人更喜歡第二種,蘋果官方文檔也推薦第二種方法去重用cell。我覺得優點是一個是在tableview劃分MVC架構時,tableview創建時不需要知道cell的類型,而只需要知道datasouce,而datasource才是需要去分配cell類型的。第二個是tableviewcell的初始化方法并非只能用initWithStyle(collectionview必須先注冊的原因則在于初始化方法只有initWithFrame)。而使用了注冊,則是在復用池空時默認調用initWithStyle的方法,如果需要用別的方法初始化就不可以了。第一種方法可以用在有一些庫需要先注冊后才能調用的,比如自動計算cell高度的庫FDTemplateLayoutCell。

好了,以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對武林網的支持。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 偏关县| 象州县| 石泉县| 德庆县| 鹤岗市| 托克逊县| 集安市| 绥化市| 洪江市| 武川县| 曲麻莱县| 上林县| 沁源县| 五莲县| 临漳县| 通辽市| 瑞安市| 建德市| 遂昌县| 扬州市| 平定县| 永平县| 广平县| 射阳县| 合肥市| 咸阳市| 来安县| 华蓥市| 阳泉市| 宜丰县| 西乌| 定南县| 林周县| 五指山市| 平泉县| 滁州市| 额敏县| 海城市| 麻栗坡县| 兴宁市| 乌拉特中旗|