Learning iOS(二)--Clock

分析

Clock 是一个最简单的计时器,涉及的概念主要是NSDateNSDateFormatter以及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的帮助了。

  1. 因为是一秒动一次,所以要不停的获取当前的时间,也就是不停地调用clock.currentTime并用NSDateFormatter处理格式。所以可以封装成一个获取时间并处理格式的函数:
func updateTimeLabel() {
    let formatter = NSDateFormatter()
    formatter.timeStyle = .MediumStyle
    timeLabel.text = formatter.stringFromDate(clock.currentTime)
  }
  1. 然后是更新的时间点:
    要在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帮我改进代码更是欢迎至极啊!☺️
刚刚起步,请多关照。🙏

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容