前言

当一个 tableView 中的 cell 类型过多时,我们务必会在 tableView 的各个代理中做这样那样的判断,当需要增加一种 cell,或调换 cell 的顺序的时候我们就会在 tableView 的各个代理中进行修改判断。 使用 ZBCellConfig 可以应对各种变态需求,当增删、调换 cell 的顺序时,只需一键配置。

简介

  • ZBCellConfig 对象实例会将 tableView 中 cell 所需的基本信息存储下来,然后放到数组中进行管理;
  • 每个 ZBCellConfig 实例与 tableView 中想要显示的 cell 相对应。(但注意,是"想要显示的"cell,由于 cell 的重用,实际上 cell 并不会生成那么多);
  • 优点:改变不同类型 cell 的顺序、增删时,极为方便,只需改变用于存放 ZBCellConfig 的数组即可,** 重点是无需在多个 tableView 代理方法中逐个修改 **。

结构

使用

  • 支持 cocoapods 导入 pod 'ZBCellConfig'
  • 直接将文件拖拽到项目中 #import "ZBCellConfig.h"

知识点


请下载示例项目查看详细使用方法及实际中如何使用 GitHub 下载地址。 初、中、高、高 MVVM 内容上是一样的,区别在于没一级别知识点递增。

基本使用

1 . 首先在控制器中声明存放 ZBCellConfig 实例的二维数组

/*** 二维数组 (匹配 tableView 的数据结构,第一层是 section,第二层放 cell)*/
@property (nonatomic, strong) NSMutableArray <NSArray <ZBCellConfig *> *> * cellConfigs;

2-1 . 初始化数组,每一个 ZBCellConfig 为 cell 的基本信息,改变不同类型 cell 的顺序、增删时,只需在此修改即可,无需在多个 tableView 代理方法中逐个修改(具体查看 Demo 注释很清晰)

-  (NSMutableArray<NSArray<ZBCellConfig *> *> *)cellConfigs {_cellConfigs = [[NSMutableArray alloc] init];// cell1ZBCellConfig *cell1Config = [ZBCellConfig cellConfigWithClass:[LowTableViewCell1 class] showCellInfoMethod:@selector(setModel:)];[_cellConfigs addObject:@[cell1Config]];// cell2ZBCellConfig *cell2Config = [ZBCellConfig cellConfigWithClass:[LowTableViewCell1 class] showCellInfoMethod:@selector(setModel:)];[_cellConfigs addObject:@[cell2Config]];// cell3....return _cellConfigs;
}

2-2 . 增删只需这样:

3 . tableView 代理中实现部分

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{return self.cellConfigs.count;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{return [self.cellConfigs[section] count];
}- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{// 根据 indexPath 获取 对应的 cellConfigZBCellConfig *cellConfig = self.cellConfigs[indexPath.section][indexPath.row];// 根据对应的 cellConfig 获取 cell,并给 cell 赋值 根据模型显示。// • dataModels: 这里由于为示例代码不是用真实数据,只起到 执行 cell 的赋值函数。在实际项目中应该传递从网络请求的真实数据。UITableViewCell *cell = [cellConfig cellOfCellConfigWithTableView:tableView dataModels:@[[LowModel new]]];return cell;
}

cell 自适应高度

1 . tableView 设置如下

/*** default is 0, which means there is no estimate* estimatedRowHeight 默认为 0,不估算cell高度* 赋值不为 0 时候,开启cell估值配合 layout 约束,进行cell高度自适应* 也就是说想要自动布局 cell 高度就给这个 estimatedRowHeight 属性赋值,值为你所有 cell 的平均高度的一个估值*/
_heightTableView.estimatedRowHeight = 100;// iOS8 系统中 rowHeight 的默认值已经设置成了 UITableViewAutomaticDimension
_heightTableView.rowHeight = UITableViewAutomaticDimension;

2 . cell 需采用 AutoLayout 布局,masory 或 xib 托线的形式皆可,约束规定上左下右还有让 cell 知道内容的高:

tableView style

  1. UITableViewStylePlain 和 UITableViewStyleGrouped 区别
  2. UITableViewStylePlain:sectionView 当 tableView cectionHeader/Footer 会默认高度为 0, 滑动到顶部时 会停留到导航栏底部
  3. UITableViewStyleGrouped:sectionView 当 tableView cectionHeader/Footer 会默认高度为 10, 滑动到顶部时 不会停留到导航栏底部
  4. 注意:当需要 为 UITableViewStyleGrouped 时查看【MediaExample 使用示例】

ZBCellConfig

通过函数 - (void)zb_performSelector:(SEL)aSelector withObjects:(NSArray *)objects来执行 初始化时配置好的showCellInfoMethod。 此函数是对 - (id)performSelector:(SEL)aSelector withObject:(id)object1 withObject:(id)object2;的一个扩展,以数组的形式来传递多参数。 函数实现部分:

// 签名
NSMethodSignature *signature = [[self class] instanceMethodSignatureForSelector:aSelector];
if (signature == nil) {NSAssert(false, @"LINE=%d ERROR - 找不到 %@ 方法", __LINE__ ,NSStringFromSelector(aSelector));
}
// 包装
NSInvocation *invocation  = [NSInvocation invocationWithMethodSignature:signature];
// 设置调用者
[invocation setTarget:self];
// 设置调用的方法 与 NSMethodSignature 签名的方法一致
[invocation setSelector:aSelector];
// 0为target 1为_cmd 所以从2索引
for (int i = 0; i < (signature.numberOfArguments - 2); i++) {id dataModel = i < objects.count ? objects[i] : nil;[invocation setArgument:&dataModel atIndex:i+2];
}
// retain 所有参数,防止释放
[invocation retainArguments];
[invocation invoke];

总结

把将要展示的几种 cell 的基本信息 以 tableView 的数据结构二维数组的形式存放,储存基本配置并不会生成多余的 cell,内部创建采用 tableView 的重用机制。示例 Demo 中注释详细,

itzhangbao/ZBCellConfig​github.com

If I have no knife,I can't protect you.If I had a sword,I can't hold you. 如果我没有刀,我就不能保护你。如果我有刀,我就不能拥抱你。 ————《剪刀手爱德华》

tableview 修改单元格内容字体大小_如何修改一次代码就可以完成多种类型 cell 的 UITableView 增删修改...相关推荐

  1. qt tableview修改表格内容_如何修改一次代码就可以完成多种类型 cell 的 UITableView 增删修改

    前言 当一个 tableView 中的 cell 类型过多时,我们务必会在 tableView 的各个代理中做这样那样的判断,当需要增加一种 cell,或调换 cell 的顺序的时候我们就会在 tab ...

  2. 修改XtraMessageBox的内容字体大小

    修改XtraMessageBox的内容字体大小 public static DialogResult Show(UserLookAndFeel lookAndFeel, IWin32Window ow ...

  3. 用xlwt和xlrd在不修改Excel单元格格式的情况下修改单元格内容

    一.问题的来源以及网上的错误方法 最近遇到了一个问题,给定了一个Excel模板,修改表格里面的内容,但是不能修改Excel表格的格式.用pywin32太慢,用xlrd只能读,用xlwt只能写. 很快, ...

  4. element 表格单元格内容不换行_实例29_在Word表格中将上下行相同内容的单元格自动合并...

    实例28讲了如何在Excel文件中自动合并上下行相同内容的单元格,此例则讲一讲如何在Word文件中做类似的操作.因为处理Excel和Word的模块是不同的,所以合并单元格也有一些差异.相对来说,Wor ...

  5. easyui 修改单元格内容_初学Excel办公软件快速修改文字的方法

    今天我们学习Excel办公软件快速修改文字的方法,首先我们看这个表格里面的文字很多都是相差一个字,甚至很多内容相差不大,因此我们在输入文字时就需要改进快速方法了. 首先我们根据图片来操作,我们修改红色 ...

  6. antd table设置表格一个单元格的字体颜色_微软Office三件套,各有一个效率神器,全都知道的人不超过1%...

    我们都知道,微软Office三件套是指Word.Excel和Powerpoint,虽然微软Office套件还有诸如Outlook.Onenote等软件,但平时用得最多的,还是这三件套. 三件套其实构成 ...

  7. 微信开发修改button里的字体大小_在微信小程序中如何修改文字大小

    这篇文章主要介绍了微信小程序实现点击按钮修改文字大小功能,涉及微信小程序事件绑定及setData动态修改Page页面data数据,进而控制页面元素属性动态改变的相关操作技巧,需要的朋友可以参考下 本文 ...

  8. java html合并单元格内容居中显示_合并Al:H1单元格区域,使合并的内容居中显示。...

    合并Al:H1单元格区域,使合并的内容居中显示. 更多相关问题 峰面积积分法有何特点? 电子邮件的发送和接收实际上是由ISP的()担任的. VFP的一个数据表文件最多允许有()条记录. 卡特尔认为,可 ...

  9. antd table设置表格一个单元格的字体颜色_开源 UI 库中,唯一同时实现了大表格虚拟化和树表格的 Table 组件

    背景 有这样一个需求,一位 React Suite (以下简称 rsuite)的用户,他需要一个 Table 组件能够像 Jira Portfolio 一样,支持树形数据,同时需要支持大数据渲染. 截 ...

  10. C# listview双击鼠标修改单元格内容

    1.C#创建winform工程: 2.在界面添加工具listview1: 3.鼠标右键点击listview1,更改属性: FullRowSelect=True     开启行选择模式,开启才可以进行双 ...

最新文章

  1. 三分钟了解“Java重写”
  2. cocos2dx 字体外发光_Ps教程:只需4个图层!即可制作出超炫酷的荧光字体
  3. 企业环境下如何把ubuntu的dhcp改为静态IP
  4. Dart 2为移动开发做出改进
  5. linux下的c库函数大全
  6. 解决AttributeError: module ‘cv2.cv2‘ has no attribute ‘estimateRigidTransform‘
  7. tomcat占用cpu比较多
  8. PHP中Header函数和PHP_AUTH_USER做用户验证
  9. VNX NETAPP NAS 备份恢复
  10. python查看图片的源代码_python实现图片筛选程序
  11. python运行命令_对python中执行DOS命令的3种方法总结
  12. matlab中的运算函数,基于Matlab软件的函数运算在实践中的应用
  13. java中,将string 转化成long
  14. DOTNET零碎要点---字符串截取操作
  15. vue 左右循环滑动_vue实现无缝滚动循环
  16. 实体关系抽取任务方法及SOTA模型总结
  17. 《大侦探皮卡丘》天龙八部在路上
  18. 「网站收录查询」百度收录批量查询工具主要有哪些?
  19. HTML入门笔记(案例+截图)
  20. html图片动态案例,10个强大的纯CSS3动画案例分享

热门文章

  1. Vmware报错 This product may not be installed on a computer that has Microsoft HyperV installed. 解决
  2. JVM监控及诊断工具GUI篇之Arthas(五):其他指令
  3. 技术复习-java类加载机制
  4. 从陪练到赢家:人机博弈的六十年
  5. Mnesia动态添加节点杂记
  6. Codeforces348B Apple Tree DFS
  7. Kohana - PHP5框架 - 我看过的开源框架
  8. 如何用CSC.exe来编译Visual C#的代码文件
  9. java多线程开发--语法糖之synchronized关键字
  10. android studio技巧之设置monitor窗口模式查看logcat