更新标签,显示Swift 3

时间:2017-08-03 12:20:22

标签: swift timer nstextfield

我正在尝试使用Swift创建一个标签,该标签将每秒更新一次。我已经尝试了几个小时(我最近才开始使用Swift),但我还没能完成它。

我已经阅读了一些文档并查看了其他人的答案。到目前为止,我有这个:

import Cocoa

class ViewController: NSViewController {

  @IBOutlet weak var timeLabel: NSTextField!

  var timer = Timer()

  let date = Date()
  let calendar = Calendar.current
  let dateFormatter = DateFormatter()

  override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view.
    dateFormatter.dateStyle = .none
    dateFormatter.timeStyle = .medium
    timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(updateTimeLabel), userInfo: nil, repeats: true);
  }

  override var representedObject: Any? {
    didSet {
    // Update the view, if already loaded.
    }
  }

  func updateTimeLabel() {
    timeLabel.stringValue = dateFormatter.string(from: date)
  }

}

所以这样做是因为它更新时间标签 - 但只更新一次 - 这是视图加载的时候。虽然我在Timer函数中添加了viewDidLoad,间隔为1秒,但标签仍然是静态的。

有人能指出我在这里做错了吗?

2 个答案:

答案 0 :(得分:3)

date是代码中的常量。 永远不会改变。

您应该在更新发生时重新初始化日期。

func updateTimeLabel() {
    timeLabel.stringValue = dateFormatter.string(from: Date())
}

答案 1 :(得分:0)

在您的情况下,updateTimeLabel在每秒后被调用,但date不可变变量未被更新,因为它曾使用当前日期设置。此外,如果您想更新date常数,则需要使用var代替let

每次调用updateTileLabel时都要获取更新的日期时间,您需要执行以下操作

func updateTimeLabel() {
    timeLabel.stringValue = dateFormatter.string(from: Date())
}