前言
我们在项目中偶尔需要让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。
好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对小牛知识库的支持。
点击列表行,展开对应的cell。 [Code4App.com]
问题内容: 我在课堂上有一个Ctrl-drag作为。现在我正在使用此代码 当我在模拟器上启动我的应用程序并单击时,我收到了此日志 我没有崩溃或发生什么事,但是没有显示键盘。我也尝试从中进行设置,但相同。 我还注意到,无论何时单击 任何 键盘,都不会显示(但 默认 键盘不会显示日志) 我正在使用Xcode-Beta 3,有人遇到过此问题吗? 问题答案: 更新到最新的Xcode Beta之后,我也遇到
我发现javamail只支持袜子。有什么解决方案可以支持http代理吗?
本文向大家介绍iOS中tableView cell分割线的一些设置技巧,包括了iOS中tableView cell分割线的一些设置技巧的使用技巧和注意事项,需要的朋友参考一下 前言 对于iOS的tableView的cell的分割线,一般我们很少使用不是系统默认的,但是有些项目要求还是要求我们去改变分割线的颜色或者外形以配合整个项目的色调。这个苹果公司早都为我们想到了。 一、关于分割线的位置。 分割
问题内容: 我正在多线程环境中通过不同的并发模型(http://tutorials.jenkov.com/java-concurrency/concurrency- models.html ) 本文重点介绍了 三种并发 模型。 平行工人 第一个并发模型是我所说的并行工作器模型。进来的工作分配给不同的 工人 。 流水线 工人的组织就像 工厂 中装配线的工人一样。每个工人仅完成全部工作的一部分。完成该
以下是我遇到问题的tableViewController的代码: