• 【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,  150, height: 15))
            lblTime.text = "倒计时5秒"
            lblTime.textColor = UIColor.gray
            lblTime.font = UIFont.systemFont(ofSize: 14)
            self.view.addSubview(lblTime)
            isTiming = true //启动计时属性观察器
        }
    
    
    自由、人生、意义、执着、残缺美 一个人认真的学习者 --------2015年3月19日
  • 相关阅读:
    Linux安装和配置java
    动态代理:JDK动态代理和CGLIB代理的区别
    常用算法复习
    Linux重新学习
    oracle复杂查询是sql
    oracle触发器
    oracle存储过程
    oracle数据库操作
    java知识回顾
    Spring AOP简述
  • 原文地址:https://www.cnblogs.com/littlemo/p/14421351.html
Copyright © 2020-2023  润新知