Swift - 更新/刷新显示时间的标签
Posted
技术标签:
【中文标题】Swift - 更新/刷新显示时间的标签【英文标题】:Swift - Update/Refresh Label that Displays Time 【发布时间】:2017-01-23 04:44:13 【问题描述】:我有一个以 12 小时格式显示当前时间的标签。
但是,它不会在每次分钟/小时更改时更新/刷新时间。
我需要它在时间变化时自动将标签更改为当前时间。
【问题讨论】:
【参考方案1】:Swift 3 解决方案
class ViewController
@IBOutlet weak var timeLabel: UILabel!
var timer: Timer?
let formatter: DateFormatter =
let tmpFormatter = DateFormatter()
tmpFormatter.dateFormat = "hh:mm a"
return tmpFormatter
()
override func viewDidLoad()
super.viewDidLoad()
timer = Timer.scheduledTimer(timeInterval: 60, target: self, selector: #selector(self.getTimeOfDate), userInfo: nil, repeats: true)
override func viewWillDisappear(_ animated: Bool)
super.viewWillDisappear(animated)
timer?.invalidate()
func getTimeOfDate()
var curDate = Date()
timeLabel.text = formatter.string(from: curDate)
【讨论】:
@reecefox 检查我的答案 请为变量、常量、属性和案例使用小写名称。 调用invalidate()
后是否需要设置定时器为nil?
@GaneshKumar 但invalidate()
还没有释放内存吗?有什么理由在invalidate()
之后调用timer = nil
吗?我认为您没有义务在 ARC 下取消 Timer 实例。
这不是很好。它以viewDidLoad
开始,以viewWillDisappear
结束。这意味着当你导航或按下主页按钮时它会停止,当你回到那里时不会重新启动。如果使用viewWillDisappear
,您应该使用viewWillAppear
来启动它。如果使用viewDidLoad
,则使用deinit
。【参考方案2】:
用您的 ViewController 代码替换以下代码,然后将 IBOutlet 连接到 showTimeLbl
class ViewController: UIViewController
@IBOutlet weak var showTimeLbl: UILabel!
var timeCount:Int = 0
var timer:Timer!
override func viewDidLoad()
super.viewDidLoad()
if(timer != nil)
timer.invalidate()
timer = Timer(timeInterval: 1.0, target: self, selector: #selector(ViewController.timerDidFire), userInfo: nil, repeats: true)
RunLoop.current.add(timer, forMode: RunLoopMode.commonModes)
func timerDidFire()
timeCount += 1
showTimeLbl.text = NSString(format: "%02d:%02d:%02d", timeCount/3600,(timeCount/60)%60,timeCount%60) as String
override func viewWillDisappear(_ animated: Bool)
super.viewWillDisappear(true)
timer?.invalidate()
timer = nil
【讨论】:
相当肯定 swift 自发布以来已经更新了数千次,因此我问了这个问题,因为其他所有的都已经过时了。 @reecefox 请检查我是否在 swift 3.0 中更新了我的答案以上是关于Swift - 更新/刷新显示时间的标签的主要内容,如果未能解决你的问题,请参考以下文章
Swift/iOS:UIPicker 显示在以编程方式更改数据源后点击后才会刷新