Learning iOS(二)--Clock

作者: Laurense | 来源:发表于2016-05-19 21:54 被阅读210次

分析

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帮我改进代码更是欢迎至极啊!☺️
刚刚起步,请多关照。🙏

相关文章

网友评论

    本文标题:Learning iOS(二)--Clock

    本文链接:https://www.haomeiwen.com/subject/xwgwrttx.html