Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 计时器问题显示时间_Ios_Swift_Timer_Dateformatter - Fatal编程技术网

Ios 计时器问题显示时间

Ios 计时器问题显示时间,ios,swift,timer,dateformatter,Ios,Swift,Timer,Dateformatter,我正在尝试用当前时间更新标签 import UIKit class ViewController: UIViewController { @IBOutlet weak var label: UILabel! let date = Date() override func viewDidLoad() { super.viewDidLoad() Timer.scheduledTimer(timeInterval: 1, target:

我正在尝试用当前时间更新标签

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)

    }


}
当我使用at
updateTime()
label.text=DateFormatter.localizedString(from:Date(),dateStyle:.none,timeStyle:.long)
时,我得到了我想要的结果

当我使用
label.text=DateFormatter.localizedString时(从:日期,日期样式:。无,时间样式:。长)

计时器坏了。谁能给我解释一下吗

根据我的理解,如果我使用日期而不是日期(),那么我需要一个计时器/计数器来计数和计算。如果有的话,有什么建议吗

非常感谢


p

在第二个示例中,
date
是一个常量值。因此,即使每秒调用一次updateTime(),每次都会将标签设置为相同的值

从评论来看,似乎您希望在计时器运行时能够提前一个恒定的时间

要从任意的
常数
日期
开始计数,请在计时器启动时存储
开始
时间。使用该值计算计时器已运行的
间隔
,然后使用该
间隔
提前
日期

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
,则可以避免出现视觉故障。

date
是一个常量值。因此,即使每秒调用一次
updateTime()
,每次都会将标签设置为相同的值。@vacawama。非常感谢。以及我如何表示标签显示从日期开始计数以及每分钟/秒等?您是否试图使标签从
0:00开始,然后每秒计数?不,基本上我希望标签从日期开始(让date=date()),然后每秒开始计数。通过解决这个小示例,我可以解决我的大示例:)像在第一个示例中那样使用
Date()
调用有什么问题。你说这样行的。那你不接受的呢?