前言

我们在项目中偶尔需要让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的变量类型的字符代表
# 子类
# 加载
# 是在
# 种方法
# 是一个
# 也有
# 好了
# 本地下载
# 我觉得
# 才是
# 就不
# 则是
# 两种
# 并在
# 第二个
# 要知道
# 重写
# 为例
# 这篇文章
# 不需
相关文章:
网站制作大概要多少钱一个,做一个平台网站大概多少钱?
制作网站的过程怎么写,用凡科建站如何制作自己的网站?
建站之星如何快速解决建站难题?
如何用AWS免费套餐快速搭建高效网站?
如何通过西部数码建站助手快速创建专业网站?
如何选择域名并搭建高效网站?
网站插件制作软件免费下载,网页视频怎么下到本地插件?
c++怎么实现高并发下的无锁队列_c++ std::atomic原子变量与CAS操作【详解】
如何在Ubuntu系统下快速搭建WordPress个人网站?
清单制作人网站有哪些,近日“兴风作浪的姑奶奶”引起很多人的关注这是什么事情?
如何通过远程VPS快速搭建个人网站?
如何用已有域名快速搭建网站?
如何通过虚拟主机空间快速建站?
C++时间戳转换成日期时间的步骤和示例代码
如何选择PHP开源工具快速搭建网站?
微信推文制作网站有哪些,怎么做微信推文,急?
沈阳制作网站公司排名,沈阳装饰协会官方网站?
建站之星展会模版如何一键下载生成?
建站之星如何开启自定义404页面避免用户流失?
专业网站制作企业网站,如何制作一个企业网站,建设网站的基本步骤有哪些?
php json中文编码为null的解决办法
移动端手机网站制作软件,掌上时代,移动端网站的谷歌SEO该如何做?
nginx修改上传文件大小限制的方法
如何在IIS中新建站点并配置端口与物理路径?
枣阳网站制作,阳新火车站打的到仙岛湖多少钱?
如何在Windows 2008云服务器安全搭建网站?
网站制作员失业,怎样查看自己网站的注册者?
,怎么在广州志愿者网站注册?
如何快速辨别茅台真假?关键步骤解析
定制建站价位费用解析与套餐推荐全攻略
如何彻底删除建站之星生成的Banner?
定制建站哪家更专业可靠?推荐榜单揭晓
香港服务器WordPress建站指南:SEO优化与高效部署策略
电商网站制作多少钱一个,电子商务公司的网站制作费用计入什么科目?
建站之星图片链接生成指南:自助建站与智能设计教程
建站之星2.7模板快速切换与批量管理功能操作指南
企业微网站怎么做,公司网站和公众号有什么区别?
专业网站制作服务公司,有哪些网站可以免费发布招聘信息?
移民网站制作流程,怎么看加拿大移民官网?
建站之星微信建站一键生成小程序+多端营销系统
正规网站制作公司有哪些,目前国内哪家网页网站制作设计公司比较专业靠谱?口碑好?
如何用低价快速搭建高质量网站?
实惠建站价格推荐:2025年高性价比自助建站套餐解析
公司网站制作价格怎么算,公司办个官网需要多少钱?
建站主机与虚拟主机有何区别?如何选择最优方案?
高防服务器租用如何选择配置与防御等级?
Python路径拼接规范_跨平台处理说明【指导】
C++用Dijkstra(迪杰斯特拉)算法求最短路径
,网页ppt怎么弄成自己的ppt?
孙琪峥织梦建站教程如何优化数据库安全?
*请认真填写需求信息,我们会在24小时内与您取得联系。