在iOS开发的过程中,UITableview是使用频率很高的控件之一,今天写的优化方法不是关于性能优化方面的,主要从为Controller瘦身方面考虑的。在使用tableView的时候不可避免的要谈到tableView的delegate和dataSource两个代理,我们经常会把这两个代理赋给Controller,在Controller里面我们会实现它的几个代理方法,最常见的有以下几个:
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section; - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath; - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath;
这里会在Controller里面产生许多不必要的代码,下面就从这两个代理方法入手,来为Controller瘦身。
delegate、dataSource从Controller中去掉,交给Tableview自己处理
在FCXTableView中将Tableview的delegate、dataSource付给自己。
- (void)fcx_setUp { self.delegate = self; self.dataSource = self; }
为了实现相应的代理方法,Tableview必须要拿到数据源,考虑到Tableview有分组和不分组两种情况,这里增加了两个属性,其中dataArray是只有一组的情况(使用dataArray时会自动把dataArray放到一个数组里然后再赋值给groupArray),groupArray是多组时用到的,如果项目中不需要分组情况时groupArray是多余的,但为了考虑兼容问题还是加上了。
@property (nonatomic, strong) NSMutableArray *groupArray; @property (nonatomic, strong) NSMutableArray *dataArray; - (void)setGroupArray:(NSMutableArray *)groupArray { NSAssert(groupArray, @"groupArray必须是数组类型"); if (![groupArray isKindOfClass:[NSArray class]]) { return; } if (_groupArray != groupArray) { _groupArray = groupArray; [self reloadData]; } } - (void)setDataArray:(NSMutableArray *)dataArray { NSAssert(dataArray, @"dataArray必须是数组类型"); if (![dataArray isKindOfClass:[NSArray class]]) { return; } self.groupArray = [[NSMutableArray alloc] initWithObjects:dataArray, nil]; }
在拿到数据源之后就可以实现代理方法了,后面解释为什么判断self.groupArray.count == 0和setDataModel:
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { if (self.groupArray.count == 0) {//无数据时 return 1; } return self.groupArray.count; } - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { if (self.groupArray.count == 0) {//无数据时 return 1; } return [self.groupArray[section] count]; } - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { if (self.groupArray.count == 0) {//无数据时 return 300; } return 44; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { if (self.groupArray.count == 0) {//无数据时 return self.noDataCell; } NSAssert([self.groupArray[indexPath.section] isKindOfClass:[NSArray class]], @"groupArray中的数据必须是数组类型"); UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:self.cellIdentifier forIndexPath:indexPath]; if (self.groupArray.count > indexPath.section && [self.groupArray[indexPath.section] count]) { id dataModel = [self.groupArray[indexPath.section] objectAtIndex:indexPath.row]; //这里的setDataModel:是更新cell数据模型的方法,可自行定义,可参考FCXTableViewCell if ([cell respondsToSelector:@selector(setDataModel:)]) { [cell performSelectorOnMainThread:@selector(setDataModel:) withObject:dataModel waitUntilDone:NO]; } } return cell; }
将数据和Cell关联。
在拿到数据源groupArray后要和展示的Cell进行关联,在定义Cell的时候每个Cell加一个dataModel的属性,默认会调用setDataModel:(上面提到的)这个方法,可以在这个方法里进行数据的处理。
- (void)setDataModel:(NSString *)dataModel { }
将点击某行Cell的代理方法用Block替代
@property (nonatomic, copy) FCXDidSelectRowBlock didSelectRowBlock; _tableView.didSelectRowBlock = ^(NSIndexPath *indexPath, id data) { };
无数据展示优化
用Tableview展示数据的时候就会遇到没有数据或者网络请求失败等情况,需要给用户展示一个当前的无数据状态(上面提到的self.groupArray.count == 0,这个用来判断无数据情况),好点的做法是在设计的时候这里能够用一个通用的模板展示样式,不过这里支持自定义展示样式并支持无数据状态的点击响应事件(noDataActionBlock用Block方式实现),只需传入你定义展示样式的noDataViewClass即可(具体可参考Demo)。
@property (nonatomic, strong) Class noDataViewClass; @property (nonatomic, copy) FCXNoDataActionBlock noDataActionBlock; _tableView.noDataActionBlock = ^(){ };
本文向大家介绍maven工程中jar包瘦身的五种方法,包括了maven工程中jar包瘦身的五种方法的使用技巧和注意事项,需要的朋友参考一下 java项目中常用maven工具来进行工程管理,但经常遇到的一个问题是生成的jar包越来越大,编译一次工程越来越慢。怎么有效地去除冗余依赖,给jar包进行瘦身,是一项必备技能。下面介绍在maven工程中jar包瘦身五大法: 一、将环境中已包含的依赖包的scop
本文向大家介绍MySQL的InnoDB扩容及ibdata1文件瘦身方案完全解析,包括了MySQL的InnoDB扩容及ibdata1文件瘦身方案完全解析的使用技巧和注意事项,需要的朋友参考一下 mysql的innodb扩容 为了添加一个数据文件到表空间中,首先要关闭 MySQL 数据库,编辑 my.cnf 文件,确认innodb ibdata文件的实际情况和my.cnf的配置是否一致,这里有两种情况
本文向大家介绍微信小程序 限制1M的瘦身技巧与方法详解,包括了微信小程序 限制1M的瘦身技巧与方法详解的使用技巧和注意事项,需要的朋友参考一下 微信小程序瘦身方法: 众所周知,微信小程序在发布的时候,对提交的代码有1M大小的限制!所以,如果你正在写一个功能稍微复杂一点的小程序,就必须得时刻小心注意你的代码是不是快触及这个底线了。 在设计一个小程序之初,我们就需要重点考虑这一点,采取一些方法,来避免
我是ignite的新手,并尝试使用示例https://github.com/apache/ignite/blob/master/examples/src/main/java/org/apache/ignite/examples/client/clientputgetexample.java null
The Kiibohd Controller This is the main Kiibohd Firmware.In general, this should be the only git repo you need to clone.The KLL compiler is automatically retrieved during the build process and will wa
所以,我有一个类似这样的问题:2020-01-30 22:54:20.059错误8040--[main]O.S.Boot.SpringApplication:应用程序运行失败 UnsatisfiedDependencyException:创建名为“Dieta Controller”的bean时出错:通过字段“Dieta Repository”表示的不满足依赖项;嵌套异常为org.springfra