定时器更新标签1秒后第二个定时器倒计时

问题描述 投票:0回答:2

我在尝试将两个定时器连接在一起时遇到了困难。我试图让计时器从指定的数量开始倒数,并让第二个计时器不断更新视图控制器上的标签。但是,我最终得到的计时器更新标签落后于计时器类中第一个计时器的1秒。这是我对视图控制器的看法:(请注意,这是我的代码的精简版本)

class HomeViewController: UIViewController {
    @IBOutlet var timeLabel: UILabel!

    override func viewDidLoad() {
        timeLabel.text = account.deedManager.globalTimer.timerStr

        Timer.scheduledTimer(timeInterval: 0.05, target: self, selector: #selector(UpdateTime), userInfo: nil, repeats: true)
    }

    @objc func UpdateTime() {
            self.timeLabel.text = account.deedManager.globalTimer.timerStr
    }
}

这是Timer类:

class TimerModel: NSObject, NSCoding {
    var myTimer: Timer? = Timer()
    var timerInterval: TimeInterval = 1.0
    var timerEnd: TimeInterval = 0.0
    var timerCount: TimeInterval = 86400.0 // 24 hours
    var timerStr: String = "TIME"

    func StartTimer(time: Double) {
        timerCount = time
        myTimer = Timer.scheduledTimer(timeInterval: 1.0, target: self, selector: #selector(UpdateTime), userInfo: nil, repeats: true)
    }

    @objc func UpdateTime() {
        self.timerStr = self.TimerDate(time: self.timerCount)
        self.timerCount-=1
        print(self.timerStr)
    }

    func TimerDate(time:TimeInterval) -> String {
        let hours = Int(time) / 3600
        let minutes = Int(time) / 60 % 60
        let seconds = Int(time) % 60
        return String(format: "%02i:%02i:%02i", hours, minutes, seconds)
    }
}

我试图让第一个计时器的间隔为0.05,以便它比计时器类更快地更新,但无论我把它放在什么时间间隔,它都会落后一秒钟。我不想将倒数计时器放在视图控制器中,因为我希望所有视图控制器的计时器都是全局的。如果您有任何想法,请告诉我。

ios swift nstimer countdown
2个回答
0
投票

首先,您需要切换顺序,以便在减少timerCount后设置文本:

@objc func UpdateTime() {
    self.timerCount-=1
    self.timerStr = self.TimerDate(time: self.timerCount)
    print(self.timerStr)
}

然后,您可以删除0.05秒计时器,因为正如您所说,这似乎不起作用。

请尝试使用委托模式。

protocol TimerModelDelegate {
    func timerTextDidChange(_ timer: TimerModel, text: String)
}

然后在TimerModel

weak var delegate: TimerModelDelegate?
var timerStr: String = "TIME" {
    didSet {
        delegate?.timerTextDidChange(self, text: timerStr)
    }
}

HomeViewController,这样做:

class HomeViewController: UIViewController, TimerModelDelegate {
    @IBOutlet var timeLabel: UILabel!

    override func viewDidLoad() {
        timeLabel.text = account.deedManager.globalTimer.timerStr
        account.deedManager.globalTimer.delegate = self
        account.deedManager.globalTimer.StartTimer(time: 60)
    }

    // You don't need the UpdateTime method here

    func timerTextDidChange(_ timer: TimerModel, text: String) {
        timeLabel.text = text
    }
}

0
投票

你有这个功能:

@objc func UpdateTime() {
    self.timerStr = self.TimerDate(time: self.timerCount)
    self.timerCount-=1
    print(self.timerStr)
}

替换为

@objc func UpdateTime() {
    self.timerCount-=1
    self.timerStr = self.TimerDate(time: self.timerCount)
    print(self.timerStr)
}

说明:首先必须更改值,然后显示它

注意前两行是交换的。这应该可以解决您的问题。

© www.soinside.com 2019 - 2024. All rights reserved.