前言

以前就有人问过这样一个问题:如果一个tableView的很多或者所有cell上都显示一个倒计时,该怎么实现? 今天自己恰好也遇到了这样的需求:很多产品,每个都有一个时限,在时限内才可以申购,过了申购功能就会关闭.简单描述就是,每个cell上有个倒计时,时间结束与否,点击cell响应的事件是不一样的.那么怎么实现呢?下面谈谈自己的思考过程.
1.Cell内部加一个定时器
既然每个cell都有一个倒计时,时间还可能不一样.根据"高内聚,低耦合"的思想,我首先想着直接让cell自己来实现倒计时功能:每个cell添加一个NSTimer,没隔1秒,让其显示的时间减少一秒.
- (void)timeChange {
self.totalSeconds --;
if (self.totalSeconds < 0) {
self.timerLabel.text = @"倒计时结束";
return;
}
self.timerLabel.text = [self timeChangeWithSeconds:self.totalSeconds];
}
- (void)setDataDict:(NSDictionary *)dataDict {
_dataDict = dataDict;
NSString *totalTime = dataDict[@"totalTime"];
self.totalSeconds = totalTime.integerValue;
self.timerLabel.text = [self timeChangeWithSeconds:self.totalSeconds];
if (!_timer) {
_timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(timeChange) userInfo:nil repeats:YES];
[[NSRunLoop currentRunLoop] addTimer:_timer forMode:UITrackingRunLoopMode];
}
}
- (NSString*)timeChangeWithSeconds:(NSInteger)seconds {
NSInteger temp1 = seconds/60;
NSInteger temp2 = temp1/ 60;
NSInteger d = temp2 / 24;
NSInteger h = temp2 % 24;
NSInteger m = temp1 % 60;
NSInteger s = seconds %60;
NSString * hour = h< 9 ? [NSString stringWithFormat:@"0%ld",(long)h] :[NSString stringWithFormat:@"%ld",(long)h];
NSString *day = d < 9 ? [NSString stringWithFormat:@"0%ld",(long)d] : [NSString stringWithFormat:@"%ld",(long)d];
NSString *minite = m < 9 ? [NSString stringWithFormat:@"0%ld",(long)m] : [NSString stringWithFormat:@"%ld",(long)m];
NSString *second = s < 9 ? [NSString stringWithFormat:@"0%ld",(long)s] : [NSString stringWithFormat:@"%ld",(long)s];
return [NSString stringWithFormat:@"%@天:%@时:%@分:%@秒",day,hour,minite,second];
}
乍看,好像一切都OK,但是当我们拖动cell时,会发现一旦cell移除屏幕,再拖回来的时候,又会重头倒计时.当然,这和我在setDataDict:方法中的赋值方式有关,可以通过totalSeconds这个属性,保存当前剩余的时间,下一次再进来的时候,去取保存好的值.
- (void)setDataDict:(NSDictionary *)dataDict {
_dataDict = dataDict;
if (self.totalSeconds !=0) {
self.timerLabel.text = [self timeChangeWithSeconds:self.totalSeconds];
}else {
NSString *totalTime = dataDict[@"totalTime"];
self.totalSeconds = totalTime.integerValue;
self.timerLabel.text = [self timeChangeWithSeconds:self.totalSeconds];
}
if (!_timer) {
_timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(timeChange) userInfo:nil repeats:YES];
[[NSRunLoop currentRunLoop] addTimer:_timer forMode:UITrackingRunLoopMode];
}
}
这样做,会发现当cell移除屏幕,再移回来的时候,不再是从头倒计时,但是多拖动几次又会发现新的问题:显示错乱,某个cell出现在了不该出现的位置.
仔细分析不难发现,cell的复用机制是引起上述现象的"罪魁祸首",要解决这个问题,可以让cell不复用,比方说,可以给每个cell绑定不同的标识,达到不复用的目的,看到这里,如果你也是这么想的,那么最好打住,因为为了达到这个目的,而让cell不复用,以牺牲内存占用为代价,无疑是饮鸩止渴,丢了西瓜,捡个芝麻.
值得的注意的是,如果在cell中实现,每个cell都添加一个定时器,这也是一笔可观的开销.
2. 在tableView的parentView中实现
既然在cell中实现遇到的坑比较多,那么又想着在外面做.这样有一个明显的好处,就是只需要一个定时器.每次触发,让每个cell上显示的时间递减.由于tableView的显示,取决于传入的数据,只要我在传入数据之前把需要传的数据处理好,这样就不会因为cell的复用机制而带来显示错乱的问题.运行代码,发现问题圆满解决!
/**定时器触发*/
- (void)timeChange {
NSMutableArray *tempArrM = [NSMutableArray array];
for (NSDictionary *dict in self.dataArr) {
NSString *totalTime = dict[@"totalTime"];
if ([totalTime isEqualToString:@"0"]) {
totalTime = @"0";
}else {
totalTime = [NSString stringWithFormat:@"%ld",totalTime.integerValue -1];
}
[tempArrM addObject:@{@"totalTime":totalTime}];
}
self.dataArr = tempArrM;
[self.pageTableView reloadData];
}
3. 值得注意的几个地方
当我们拖动cell时,如果发现定时器不工作,可以用如下方式解决.
_timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(timeChange) userInfo:nil repeats:YES]; [[NSRunLoop currentRunLoop] addTimer:_timer forMode:UITrackingRunLoopMode];
关于数据的传入:
虽然,我这边自己用的第一种方式写的Demo,但是,相比之下,我更加倾向于第二种数据的传递方式,准确性高,也能为后端同事剩些事.
总结
由于这只是一个最初的Demo,也只是一些个人的初步看法,难免有些疏漏,如有纰漏,还望指正.
好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对的支持。
# ios
# cell倒计时
# cell中添加倒计时
# cell
# 倒计时
# 重用
# IOS开发代码分享之用nstimer实现倒计时功能
# IOS实现验证码倒计时功能(一)
# IOS关于大型网站抢购、距活动结束
# 剩余时间倒计时的实现代码
# ios 实现倒计时的两种方式
# iOS中实现简单易懂秒杀倒计时/倒计时代码
# iOS实现毫秒倒计时的方法详解
# iOS获取短信验证码倒计时的两种实现方法
# iOS启动页倒计时跳过按钮功能
# Swift实现iOS应用中短信验证码倒计时功能的实例分享
# iOS实现秒杀活动倒计时
# 复用
# 自己的
# 拖动
# 都有
# 我在
# 还剩
# 给我们
# 当我们
# 又会
# 移除
# 截止时间
# 的是
# 是一个
# 几个
# 就会
# 如果你
# 给我
# 饮鸩止渴
# 好了
相关文章:
如何快速搭建二级域名独立网站?
如何在建站宝盒中设置产品搜索功能?
制作网站的过程怎么写,用凡科建站如何制作自己的网站?
建站ABC备案流程中有哪些关键注意事项?
建站之星×万网:智能建站系统+自助建站平台一键生成
惠州网站建设制作推广,惠州市华视达文化传媒有限公司怎么样?
c++ stringstream用法详解_c++字符串与数字转换利器
已有域名和空间如何快速搭建网站?
如何通过虚拟机搭建网站?详细步骤解析
宝塔新建站点为何无法访问?如何排查?
官网自助建站平台指南:在线制作、快速建站与模板选择全解析
Python如何创建带属性的XML节点
百度网页制作网站有哪些,谁能告诉我百度网站是怎么联系?
已有域名能否直接搭建网站?
详解免费开源的.NET多类型文件解压缩组件SharpZipLib(.NET组件介绍之七)
青岛网站设计制作公司,查询青岛招聘信息的网站有哪些?
网站海报制作教学视频教程,有什么免费的高清可商用图片网站,用于海报设计?
建站主机与虚拟主机有何区别?如何选择最优方案?
h5网站制作工具有哪些,h5页面制作工具有哪些?
制作电商网页,电商供应链怎么做?
企业在线网站设计制作流程,想建设一个属于自己的企业网站,该如何去做?
怎么制作一个起泡网,水泡粪全漏粪育肥舍冬季氨气超过25ppm,可以有哪些措施降低舍内氨气水平?
香港服务器网站卡顿?如何解决网络延迟与负载问题?
网站制作难吗安全吗,做一个网站需要多久时间?
香港服务器网站搭建教程-电商部署、配置优化与安全稳定指南
如何快速搭建高效可靠的建站解决方案?
如何破解联通资金短缺导致的基站建设难题?
网站制作公司,橙子建站是合法的吗?
电商网站制作多少钱一个,电子商务公司的网站制作费用计入什么科目?
建设网站制作价格,怎样建立自己的公司网站?
建站主机选哪种环境更利于SEO优化?
武汉网站制作费用多少,在武汉武昌,建面100平方左右的房子,想装暖气片,费用大概是多少啊?
在线制作视频网站免费,都有哪些好的动漫网站?
详解jQuery中基本的动画方法
建站之星导航菜单设置与功能模块配置全攻略
如何在Mac上搭建Golang开发环境_使用Homebrew安装和管理Go版本
,网页ppt怎么弄成自己的ppt?
企业网站制作费用多少,企业网站空间一般需要多大,费用是多少?
linux top下的 minerd 木马清除方法
h5在线制作网站电脑版下载,h5网页制作软件?
建站之星安装模板失败:服务器环境不兼容?
定制建站流程步骤详解:一站式方案设计与开发指南
阿里云网站制作公司,阿里云快速搭建网站好用吗?
建站中国必看指南:CMS建站系统+手机网站搭建核心技巧解析
如何快速生成凡客建站的专业级图册?
怎么用手机制作网站链接,dw怎么把手机适应页面变成网页?
怎么将XML数据可视化 D3.js加载XML
网站规划与制作是什么,电子商务网站系统规划的内容及步骤是什么?
如何实现建站之星域名转发设置?
建站之星与建站宝盒如何选择最佳方案?
*请认真填写需求信息,我们会在24小时内与您取得联系。