【2021】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、两个属性观察器间逻辑关联

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

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

    /// 计时器
    var theTimer:Timer?
    /// 是否计时状态
    var isTiming : Bool = false
    {
        willSet
        {
            if newValue
            {
                theTimer  = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(updateTime(timer:)), userInfo: nil, repeats: true)
            }else
            {
                theTimer?.invalidate()
                theTimer = nil
            }
        }
    }
    /// 倒计时更新计时时间
    /// - Parameter timer: 计时器
    @objc func updateTime(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(updateTime(timer:)), userInfo: nil, repeats: true)
                remainder = 5 //计时变量属性观察器
                self.lblTime.text = "倒计时\(remainder)秒"
            }else
            {
                theTimer?.invalidate()
                theTimer = nil
            }
        }
    }
    
    /// 倒计时更新计时时间
    /// - Parameter timer: 计时器
    @objc func updateTime(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 //启动计时属性观察器
    }

posted @ 2021-02-20 15:16  米粥煮熊猫  阅读(59)  评论(0编辑  收藏  举报