- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在尝试将两个计时器链接在一起时遇到困难。我试图让计时器从指定的数量开始倒计时,并让第二个计时器不断更新 View Controller 上的标签。然而,我最终发现更新标签的计时器落后于计时器类中的第一个计时器整整 1 秒。这是我的 View Controller :(请注意,这是我的代码的精简版本)
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 的间隔,以便它比计时器类更新得更快,但无论我将其设置为什么间隔,它都会准确地落后一秒。我不想将倒计时器放在 View Controller 内,因为我希望所有 View Controller 都有全局计时器。如果您有任何想法,请告诉我。
最佳答案
首先,您需要切换顺序,以便在递减 timerCount
后设置文本:
@objc func UpdateTime() {
self.timerCount-=1
self.timerStr = self.TimerDate(time: self.timerCount)
print(self.timerStr)
}
然后,您可以删除 0.05 秒计时器,因为正如您所说,这似乎不起作用。
尝试使用委托(delegate)模式。
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
}
}
关于ios - 定时器更新标签比第二个定时器倒计时晚 1 秒,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55074556/
我正在使用ScheduledExecutorService使用 scheduleAtFixedRate 方法每小时提供一次数据库更新。问题是它逐渐变得更晚 - 在长期服务中我一直在记录它并且每天大约一
我有一个连接到 UILabel 的 UIDatePicker。我希望用户选择 18 年前的生日(年龄限制)。所以我用这一行来设置 maximumDate 值: datePicker.maximumDa
当我重新启动设备时,我收到 BOOT_COMPLETED广播比其他应用程序慢得多(大约 10-15 秒后)。 我看过this .但我不认为这是完全正确的。我如何(我认为)证明它是错误的: (让我们将
我有一个从 DatePickerDialog 的 onDateSetListener 调用的 TimePickerDialog,以便允许用户依次选择日期和时间。我将信息存储在日历对象 calendar
我需要查找客户是否在上一年和下一年进行了订阅,以及下一年有多少订阅是新的或被取消的。 示例数据: 身份证订阅年份120101201112019220112201232010 考虑这种方法:在订阅年份中
我必须编写一个 JavaScript 函数来检查两个日期(格式为 dd/MM/yyyy)的时间间隔是否最多为 3 个月。 我可以从两个文本框中检索两个值(无需检查格式,我已经获得了一个可以自动正确设置
我有一个输入框,类型为“时间”。我想将迟到时间 (23:00pm) 作为最小值,将早期时间 (6:00am) 作为最大值 - 创建一个 23pm - 6am 的范围。 (即中午 11 点、中午 12
我是一名优秀的程序员,十分优秀!