我很难将两个计时器链接在一起。我正在尝试使计时器从指定的数量开始递减,并让第二个计时器不断更新视图控制器上的标签。但是,最后我得到了一个计时器,该计时器在计时器类中的第一个计时器之后精确地滞后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,以便它比计时器类更新的速度更快,但是无论我将其设置为什么间隔,它都恰好落后第二秒。我不想将倒数计时器放置在视图控制器内部,因为我希望所有视图控制器都使用全局计时器。如果您有任何想法,请告诉我。
答案 0 :(得分: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)
}
说明: 您首先必须更改该值,然后显示它
请注意,前两行已互换。这应该可以解决您的问题。
答案 1 :(得分: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
}
}