iOS 在cell中使用倒计时的处理方法(新)

本文介绍了一种在iOS应用中实现每个UITableViewCell倒计时效果的方法,并提供了Objective-C和Swift的示例代码。通过定制化的倒计时管理器,文章详细讲解了如何设置和更新倒计时显示,同时给出了常见问题的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文来自简书,原文地址:http://www.jianshu.com/p/af62a56ef7e2

前言

之前的文章iOS 在cell中使用倒计时的处理方法得到大量的支持, 在这先感谢大家的支持. 但是也收到不少人的回复表示不会用, 需要一一解答, 由于之前写的时候没有使用Markdown编辑, 所以现在没法更新之前的文章, 重新写一份清晰的文章

需求: 每条Cell中显示倒计时, 并随时间进行倒数
语言: Objective-C & Swift
系统: iOS
Github地址: OYCountDownManager

原理分析


原理分析图.png

效果图.gif

使用方法

1. 导入"OYCountDownManager.h"

2. 在第一次使用的地方调用[kCountDownManager start]

- (void)viewDidLoad {
    [super viewDidLoad];

    // 启动倒计时管理
    [kCountDownManager start];
}

3. 在Cell初始化中监听通知 kCountDownNotification

- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {
    if (self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]) {
        // 监听通知
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(countDownNotification) name:kCountDownNotification object:nil];
    }
    return self;
}

4. 在cell设置通知回调, 取得时间差, 根据时间差进行处理

- (void)countDownNotification {
    /// 计算倒计时
    NSInteger countDown = [self.model.count integerValue] - kCountDownManager.timeInterval;
    if (countDown <= 0) {
          // 倒计时结束时回调
          xxxx(使用代理或block)
    }return;
    /// 重新赋值
    self.timeLabel.text = [NSString stringWithFormat:@"倒计时%02zd:%02zd:%02zd", countDown/3600,       (countDown/60)%60, countDown%60];
}

5. 当刷新数据时,调用reload方法

- (void)reloadData {
    // 网络加载数据

    // 调用[kCountDownManager reload]
    [kCountDownManager reload];
    // 刷新
    [self.tableView reloadData];
}

6. 当不需要倒计时时, 废除定时器

      [kCountDownManager invalidate];

注意事项

滚动cell时出去文字闪烁

在给cell的模型赋值后, 最好手动调用一下countDownNotification方法, 保证及时刷新

 ///  重写setter方法
 - (void)setModel:(Model *)model {
     _model = model;
     self.titleLabel.text = model.title;
     // 手动调用通知的回调
     [self countDownNotification];
}

倒计时为0后出现复用问题

在倒计时为0后, 应该回调给控制器, 从后台请求一次数据, 保证倒计时没有出现误差

 if (countDown <= 0) {
           // 倒计时结束时回调
           xxxx(使用代理或block)
     }return;

出现每秒倒计时减2的问题

查看定时器设置是否正确, 或者通知是否监听了两次, 最好将监听通知的方法写在init中, 而不是写在awakeFromNib中

如果还有不懂的问题, 或者出现其它bug
请查看Demo: Demo

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值