分析
Clock 是一个最简单的计时器,涉及的概念主要是NSDate
、NSDateFormatter
以及NSTimer
。
NSDate
NSDate用来创建一个NSDate()的实例变量以获取时间;
先建一个storyboard
里的Label
,然后关联ViewController.swift
:
@IBOutlet weak var timeLabel: UILabel!
我创建了一个Clock类,包含一个返回NSDate()的计算属性变量:
//Clock.swift
//Clock
//
import Foundation
class Clock {
var currentTime: NSDate {
return NSDate()
}
}
然后在ViewController.swift
里创建一个Clock
类的实例clock
:
let clock = Clock()
NSDateFormatter
timeStyle
设置为.MediumStyle
;
然后使用stringFromDate(clock.currentTime)
将当前时间转化为字符串。
NSTimer
以上都是比较容易理解的概念,但是做完上面的会发现时间没有更新(update),只是在view load之后出现一个时间(如果是写在viewDidLoad中),然后就不动了。
要保持时间持续更新,就需要NSTimer的帮助了。
- 因为是一秒动一次,所以要不停的获取当前的时间,也就是不停地调用
clock.currentTime
并用NSDateFormatter
处理格式。所以可以封装成一个获取时间并处理格式的函数:
func updateTimeLabel() {
let formatter = NSDateFormatter()
formatter.timeStyle = .MediumStyle
timeLabel.text = formatter.stringFromDate(clock.currentTime)
}
- 然后是更新的时间点:
要在view出现之前就已经更新(update)好了时间,也就是需要viewWillAppear()
方法了。
override func viewWillAppear(animated: Bool) {
super.viewWillAppear(true)
updateTimeLabel()
NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: "updateTimeLabel", userInfo: nil, repeats: true)
}
这里使用scheduledTimerWithTimeInterval
方法保证一秒调用一次updateTimeLabel()
更新时间。
之所以要在NSTimer...
之前调用一次updateTimeLable()
是因为scheduledTimerWithTimeInterval
第一次调用是在viewWillAppear()
调用之后,所以会出现小段时间的没有内容,这显然是不可忍受的。(>﹏<)
所以就在之前先调一次😐。如果有更好的处理方式一定要告诉我。
后记
欢迎大家关注我的GitHub主页。
这个Clock项目也在其中,欢迎所有的Star⭐️、Issue,当然大神pull request帮我改进代码更是欢迎至极啊!☺️
刚刚起步,请多关照。🙏