swift - 具有新时间间隔的重复计时器
问题描述
嗨,这是我的第一个应用程序,我一直在试图弄清楚如何完成这个简单的任务,但是信息过多,我觉得可能有一种更简单的方法来完成它。
我正在尝试构建一个随机单词生成器,它将以随机时间间隔从一组单词中进行选择。计时器触发后,时间需要更改。计时器可以在应用程序打开的整个过程中保持运行。
到目前为止,这是我的代码:
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var label: UILabel!
@objc weak var paraTimer: Timer?
override func viewDidLoad() {
super.viewDidLoad()
let randomNum = Int.random(in: 1..<5)
paraTimer = Timer.scheduledTimer(timeInterval: TimeInterval(randomNum), target: self, selector: #selector(runTimedCode), userInfo: nil, repeats: true)
}
/*
This invalidates my timer, not sure if I need to start a new timer now or if I can reset this?
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
paraTimer?.invalidate()
*/
@objc func runTimedCode() {
let array = ["Apple", "Banana", "Pear" ]
label.text = array.randomElement()
}
}
所以我需要解决的问题是它会从 1-5 中选择一个随机数,然后不选择一个新数字,而是每隔 x 秒继续运行一次。我还应该使计时器无效还是将其关闭?
谢谢你。就像我说的,这是我第一次开发不只是遵循直接教程的应用程序。
解决方案
要以不同的间隔重新启动计时器,您必须重新创建计时器。
首先声明计时器强并且不需要@objc
var paraTimer: Timer?
我建议创建一个额外的方法。声明计时器不重复并使用基于块的 API Timer
。计时器会自行重新启动。
func restartTimer() {
let randomNum = Int.random(in: 1..<5)
paraTimer = Timer.scheduledTimer(timeInterval: TimeInterval(randomNum), repeats: false) { [weak self] _ in
let array = ["Apple", "Banana", "Pear" ]
self?.label.text = array.randomElement()
self?.restartTimer()
}
}
启动计时器viewWillAppear
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
restartTimer()
}
并阻止它viewDidDisappear
override func viewDidDisappear(_ animated: Bool) {
super.viewDidDisappear(animated)
paraTimer?.invalidate()
paraTimer = nil
}
推荐阅读
- kotlin - Kotlin alternative for @SuppressWarnings("WeakerAccess")
- python - 获取 ImportError
- bash - 当用户单击 Linux 中的切换用户选项时,如何运行脚本?
- python - 请求 http lib:包括 X-Request-ID
- c - 为什么这个程序只运行一次?
- node.js - 如何找到 NODE_MODULE_VERSION?
- android - 通过 android 中的 Wi-Fi/移动连接获取下载更新的状态
- excel - Copypicture 不适用于以数字标记的单元格范围
- angular - 获取 angular 8 来发布 http 请求的问题,邮递员工作正常
- ionic-framework - Ionic 在同一页面中使用多个 chart.js 画布