IOS技术:属性观察器(Property Observers)倒计时实现

IOS技术 属性观察器(Property Observers) 倒计时实现

开发工具 : Xcode 14.2
编程语言 : Swift 5
语法特性 : 属性观测器 (Property Observers)

1. 属性观测器(Property Observers)简述

属性观察器概念
用来监控和响应属性值得变化,每次属性被设置值的时候都会调用属性观察器,即使新的值和现有值相同也不例外。

属性观察器有两类:
willSet :在新的值被设置之前调用
didSet :在新的值被设置之后调用

Code实例

   var variableI : Int = 0
   {
       willSet{
           if newValue > 0 {
               #逻辑code#
           }
       }
       didSet
       {
           if oldValue < 10 {
               #逻辑code#
           }
       }
   }

2.倒计时实现

实现后效果

在这里插入图片描述

思路分析

一般倒计时思路

1、定义计时器
2、设置倒计时总时间及计时间隔
3、编写定时器定时执行方法,方法内处理计时业务逻辑

属性观测器倒计时思路

1、定义是否倒计时属性观察器
2、定义计时时间属性观察器
3、两个属性观察器间逻辑关联

3.属性观察器倒计时实现源码

1、定义是否倒计时属性观察器

通过此观察器,控制是否开启计时器

    /// 计时器
    var theTimer:Timer?
    /// 是否计时状态
    var isTiming : Bool = false
    {
        willSet
        {
            if newValue
            {
                theTimer  = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(updateRemainder(timer:)), userInfo: nil, repeats: true)
            }else
            {
                theTimer?.invalidate()
                theTimer = nil
            }
        }
    }
    /// 倒计时更新计时时间
    /// - Parameter timer: 计时器
    @objc func updateRemainder(timer:Timer)
    {
         //对计时时间秒,进行控制,一般情况是逐秒减一
    }

2、定义计时时间属性观察器

通过此观察器内,处理计时和显示的业务逻辑

    /// 剩余时间(秒)
    var remainder : Int = 0 {
        willSet
        {
            self.lblTime.text = "\(newValue)"
            if newValue <= 0
            {
                self.lblTime.text =  "计时结束"
                isTiming = false
            }
        }
    }

3、两个属性观察器间逻辑关联,完整Code

计时时间属性观察器添加计时为0,停止计时器逻辑
是否计时属性观察器,添加计时时间值初始化
定义显示时间信息的UILabel


    /// 用作显示信息的标签
    var lblTime = UILabel.init()
    /// 当前页面使用的计时器
    var theTimer:Timer?
    /// 剩余时间(秒)
    var remainder : Int = 0 {
        willSet
        {
            self.lblTime.text = "倒计时\(newValue)秒"
            if newValue <= 0
            {
                self.lblTime.text =  "计时结束"
                isTiming = false
            }
        }
    }
    
    /// 是否计时状态
    var isTiming : Bool = false
    {
        willSet
        {
            if newValue
            {
                theTimer  = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(updateRemainder(timer:)), userInfo: nil, repeats: true)
                remainder = 5 //计时变量属性观察器
                self.lblTime.text = "倒计时\(remainder)秒"
            }else
            {
                theTimer?.invalidate()
                theTimer = nil
            }
        }
    }
    
    /// 倒计时更新计时时间
    /// - Parameter timer: 计时器
    @objc func updateRemainder(timer:Timer)
    {
        remainder -= 1
    }
    
    // MARK: --页面载入方法
    /// 页面载入方法
    override func viewDidLoad() {
        super.viewDidLoad()
        self.view.backgroundColor = UIColor.white
        // Do any additional setup after loading the view.
        lblTime=UILabel.init(frame: CGRect.init(x: 75, y: 7, width: 150, height: 15))
        lblTime.text = "倒计时5秒"
        lblTime.textColor = UIColor.gray
        lblTime.font = UIFont.systemFont(ofSize: 14)
        self.view.addSubview(lblTime)
        isTiming = true //启动计时属性观察器
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值