【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 //启动计时属性观察器
}
自由、人生、意义、执着、残缺美
一个人认真的学习者
--------2015年3月19日