计时器问题呈现时间
Timer issue presenting time
我正在尝试用当前时间更新标签。
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var label: UILabel!
let date = Date()
override func viewDidLoad() {
super.viewDidLoad()
Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(updateTime), userInfo: nil, repeats: true)
}
func updateTime(){
label.text = DateFormatter.localizedString(from: Date(), dateStyle: .none, timeStyle: .long)
}
}
当我在 updateTime()
label.text = DateFormatter.localizedString(from: Date(), dateStyle: .none, timeStyle: .long)
使用时,我得到了我想要的结果
当我使用label.text = DateFormatter.localizedString(from: date, dateStyle: .none, timeStyle: .long)
定时器不工作。有人可以解释一下吗? ?
根据我的理解,如果我使用日期而不是 Date(),那么我需要一个 timer/counter 来计数和计算。如果有什么建议?
非常感谢
P
在您的第二个示例中,date
是一个常数值。因此,即使每秒调用一次 updateTime(),它每次都会将标签设置为相同的值。
从评论来看,您似乎希望能够在计时器为 运行 时提前固定时间。
要从任意 constant
Date
开始计数,请在计时器启动时存储一个 start
时间。用它来计算 interval
计时器已经 运行,然后用那个 interval
来推进 date
:
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var label: UILabel!
let date = Date()
var start: Date?
override func viewDidLoad() {
super.viewDidLoad()
// Save the time when the timer starts
start = Date()
Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(updateTime), userInfo: nil, repeats: true)
}
func updateTime(){
// compute how long the timer has been running
let interval = Date().timeIntervalSince(start!)
// compute new date based on how long the timer has been running
let newDate = date.addingTimeInterval(interval)
label.text = DateFormatter.localizedString(from: newDate, dateStyle: .none, timeStyle: .long)
}
}
计时器触发不是很准确,您可能会看到您的计数暂停一秒然后跳转 2 秒。如果您将计时器间隔设置得更小,例如 0.1
,则可以避免视觉故障。
我正在尝试用当前时间更新标签。
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var label: UILabel!
let date = Date()
override func viewDidLoad() {
super.viewDidLoad()
Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(updateTime), userInfo: nil, repeats: true)
}
func updateTime(){
label.text = DateFormatter.localizedString(from: Date(), dateStyle: .none, timeStyle: .long)
}
}
当我在 updateTime()
label.text = DateFormatter.localizedString(from: Date(), dateStyle: .none, timeStyle: .long)
使用时,我得到了我想要的结果
当我使用label.text = DateFormatter.localizedString(from: date, dateStyle: .none, timeStyle: .long)
定时器不工作。有人可以解释一下吗? ?
根据我的理解,如果我使用日期而不是 Date(),那么我需要一个 timer/counter 来计数和计算。如果有什么建议?
非常感谢
P
在您的第二个示例中,date
是一个常数值。因此,即使每秒调用一次 updateTime(),它每次都会将标签设置为相同的值。
从评论来看,您似乎希望能够在计时器为 运行 时提前固定时间。
要从任意 constant
Date
开始计数,请在计时器启动时存储一个 start
时间。用它来计算 interval
计时器已经 运行,然后用那个 interval
来推进 date
:
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var label: UILabel!
let date = Date()
var start: Date?
override func viewDidLoad() {
super.viewDidLoad()
// Save the time when the timer starts
start = Date()
Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(updateTime), userInfo: nil, repeats: true)
}
func updateTime(){
// compute how long the timer has been running
let interval = Date().timeIntervalSince(start!)
// compute new date based on how long the timer has been running
let newDate = date.addingTimeInterval(interval)
label.text = DateFormatter.localizedString(from: newDate, dateStyle: .none, timeStyle: .long)
}
}
计时器触发不是很准确,您可能会看到您的计数暂停一秒然后跳转 2 秒。如果您将计时器间隔设置得更小,例如 0.1
,则可以避免视觉故障。