全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

iOS如何让tableview支持不同种类的cell详解

前言

我们在项目中偶尔需要让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。

好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对的支持。


# ios  # tableviewcell  # 自定义tableviewcell  # cell嵌套tableview  # iOS触摸事件UITouch应用详解  # iOS二维码的生成代码  # IOS中的target action控件的实现  # iOS获取某个日期后n个月的日期  # iOS实现支持小数的星星评分组件实例代码  # React Native第三方平台分享的实例(Android  # IOS双平台)  # IOS 开发之ObjectiveC的变量类型的字符代表  # 子类  # 加载  # 是在  # 种方法  # 是一个  # 也有  # 好了  # 本地下载  # 我觉得  # 才是  # 就不  # 则是  # 两种  # 并在  # 第二个  # 要知道  # 重写  # 为例  # 这篇文章  # 不需 


相关文章: 唐山网站制作公司有哪些,唐山找工作哪个网站最靠谱?  网站好制作吗知乎,网站开发好学吗?有什么技巧?  黑客入侵网站服务器的常见手法有哪些?  建站之星后台管理如何实现高效配置?  济南专业网站制作公司,济南信息工程学校怎么样?  桂林网站制作公司有哪些,桂林马拉松怎么报名?  简历在线制作网站免费,免费下载个人简历的网站是哪些?  如何访问已购建站主机并解决登录问题?  如何用PHP工具快速搭建高效网站?  北京网站制作费用多少,建立一个公司网站的费用.有哪些部分,分别要多少钱?  高端云建站费用究竟需要多少预算?  公司网站制作费用多少,为公司建立一个网站需要哪些费用?  如何通过FTP服务器快速搭建网站?  c# 服务器GC和工作站GC的区别和设置  建站之星图片链接生成指南:自助建站与智能设计教程  婚礼视频制作网站,学习*后期制作的网站有哪些?  如何做网站制作流程,*游戏网站怎么搭建?  定制建站模板如何实现SEO优化与智能系统配置?18字教程  详解ASP.NET 生成二维码实例(采用ThoughtWorks.QRCode和QrCode.Net两种方式)  小建面朝正北,A点实际方位是否存在偏差?  学生网站制作软件,一个12岁的学生写小说,应该去什么样的网站?  如何配置WinSCP新建站点的密钥验证步骤?  佛山企业网站制作公司有哪些,沟通100网上服务官网?  湖南网站制作公司,湖南上善若水科技有限公司做什么的?  在线流程图制作网站手机版,谁能推荐几个好的CG原画资源网站么?  南阳网站制作公司推荐,小学电子版试卷去哪里找资源好?  建站为何优先选择香港服务器?  制作旅游网站html,怎样注册旅游网站?  建站之星展会模版如何一键下载生成?  如何选择域名并搭建高效网站?  python的本地网站制作,如何创建本地站点?  岳西云建站教程与模板下载_一站式快速建站系统操作指南  建站之星如何通过成品分离优化网站效率?  海南网站制作公司有哪些,海口网是哪家的?  css网站制作参考文献有哪些,易聊怎么注册?  电影网站制作价格表,那些提供免费电影的网站,他们是怎么盈利的?  专业型网站制作公司有哪些,我设计专业的,谁给推荐几个设计师兼职类的网站?  长沙做网站要多少钱,长沙国安网络怎么样?  c# 在高并发下使用反射发射(Reflection.Emit)的性能  宝塔面板如何快速创建新站点?  移动端手机网站制作软件,掌上时代,移动端网站的谷歌SEO该如何做?  ,南京靠谱的征婚网站?  如何解决ASP生成WAP建站中文乱码问题?  网站视频怎么制作,哪个网站可以免费收看好莱坞经典大片?  如何零成本快速生成个人自助网站?  非常酷的网站设计制作软件,酷培ai教育官方网站?  广州网站制作的公司,现在专门做网站的公司有没有哪几家是比较好的,性价比高,模板也多的?  如何在万网自助建站平台快速创建网站?  建站之星备案流程有哪些注意事项?  Avalonia如何实现跨窗口通信 Avalonia窗口间数据传递 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。