我在尝试将两个定时器连接在一起时遇到了困难。我试图让计时器从指定的数量开始倒数,并让第二个计时器不断更新视图控制器上的标签。但是,我最终得到的计时器更新标签落后于计时器类中第一个计时器的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,以便它比计时器类更快地更新,但无论我把它放在什么时间间隔,它都会落后一秒钟。我不想将倒数计时器放在视图控制器中,因为我希望所有视图控制器的计时器都是全局的。如果您有任何想法,请告诉我。
首先,您需要切换顺序,以便在减少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
}
}
你有这个功能:
@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)
}
说明:首先必须更改值,然后显示它
注意前两行是交换的。这应该可以解决您的问题。