Swift 定时器应用
Swift Timer App
我正在尝试使用 swift3 构建一个简单的 ios 计时器应用程序。我使用以下代码成功创建了一个应用程序。它有三个按钮,一个用于启动定时器,一个用于停止定时器,这意味着重置,一个用于暂停定时器。所有按钮都在工作,但是当我在计时器为 运行 时再次单击开始时,计时器间隔加快(意味着在一秒钟内调用选择器函数两次)。如何解决这个问题呢。
这是我的代码
@IBOutlet weak var lbl: UILabel!
var time = 0
var timer = Timer()
@IBOutlet weak var start: UIButton!
@IBOutlet weak var stop: UIButton!
@IBOutlet weak var pause: UIButton!
@IBAction func start(_ sender: AnyObject) {
timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(ViewController.action), userInfo: nil, repeats: true)
}
@IBAction func stop(_ sender: AnyObject) {
//timer.invalidate()
time = 0
lbl.text = "0"
}
@IBAction func pause(_ sender: AnyObject) {
timer.invalidate()
}
override func viewDidLoad() {
super.viewDidLoad()
}
func action() {
time += 1
lbl.text = String(time)
}
如果您的 start
方法 运行s 而计时器已经处于活动状态,您将创建第二个计时器。现在您有两个计时器调用相同的操作,这说明了您的问题。预定计时器由它们的 运行 循环保留,因此即使您没有对旧计时器的引用,它仍然存在。
至少您需要使旧计时器失效,或者继续使用现有计时器。但是有一些东西可以帮助使代码更好:
- 您的
timer
属性应该是 Swift 可选的。将其初始化为 Timer()
没有任何用处。如果没有计时器应该 运行ning. 时 timer
可以为 nil 会更有意义
- 当计时器 运行 正在计时时,您可能应该禁用 "start" 按钮。当计时器已经启动时,激活它是没有意义的。您可以通过为按钮设置
IBOutlet
并在按钮的 isEnabled
属性. 时更改值来完成此操作
我认为如果有定时器,你需要做的是使它无效运行
@IBAction func start(_ sender: AnyObject) {
if (timer) {
timer.invalidate()
}
timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(ViewController.action), userInfo: nil, repeats: true)
}
@IBOutlet weak var lbl: UILabel!
var time = 0
var timer : Timer?
var isPause = false
@IBOutlet weak var start: UIButton!
@IBOutlet weak var stop: UIButton!
@IBOutlet weak var pause: UIButton!
@IBAction func start(_ sender: AnyObject) {
timer?.invalidate()
timer = nil
isPause = false
time = 0
lbl.text = "0"
// or call stop(self.stop)
timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(ViewController.action), userInfo: nil, repeats: true)
}
@IBAction func stop(_ sender: AnyObject) {
timer?.invalidate()
timer = nil
isPause = false
time = 0
lbl.text = "0"
}
@IBAction func pause(_ sender: AnyObject) {
timer.invalidate()
isPause = !isPause // second click to resum...
}
override func viewDidLoad() {
super.viewDidLoad()
}
func action() {
if !isPause {
time += 1
lbl.text = String(time)
}
}
源代码中的一个错误。
首先停止现有定时器,然后启动新定时器。
代码如下。
@IBAction func start(_ sender: AnyObject) {
timer.invalidate()
timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(ViewController.action), userInfo: nil, repeats: true)
}
并且对于停止定时器使用无效定时器功能。
@IBAction func stop(_ sender: AnyObject) {
timer.invalidate()
}
我正在尝试使用 swift3 构建一个简单的 ios 计时器应用程序。我使用以下代码成功创建了一个应用程序。它有三个按钮,一个用于启动定时器,一个用于停止定时器,这意味着重置,一个用于暂停定时器。所有按钮都在工作,但是当我在计时器为 运行 时再次单击开始时,计时器间隔加快(意味着在一秒钟内调用选择器函数两次)。如何解决这个问题呢。 这是我的代码
@IBOutlet weak var lbl: UILabel!
var time = 0
var timer = Timer()
@IBOutlet weak var start: UIButton!
@IBOutlet weak var stop: UIButton!
@IBOutlet weak var pause: UIButton!
@IBAction func start(_ sender: AnyObject) {
timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(ViewController.action), userInfo: nil, repeats: true)
}
@IBAction func stop(_ sender: AnyObject) {
//timer.invalidate()
time = 0
lbl.text = "0"
}
@IBAction func pause(_ sender: AnyObject) {
timer.invalidate()
}
override func viewDidLoad() {
super.viewDidLoad()
}
func action() {
time += 1
lbl.text = String(time)
}
如果您的 start
方法 运行s 而计时器已经处于活动状态,您将创建第二个计时器。现在您有两个计时器调用相同的操作,这说明了您的问题。预定计时器由它们的 运行 循环保留,因此即使您没有对旧计时器的引用,它仍然存在。
至少您需要使旧计时器失效,或者继续使用现有计时器。但是有一些东西可以帮助使代码更好:
- 您的
timer
属性应该是 Swift 可选的。将其初始化为Timer()
没有任何用处。如果没有计时器应该 运行ning. 时 - 当计时器 运行 正在计时时,您可能应该禁用 "start" 按钮。当计时器已经启动时,激活它是没有意义的。您可以通过为按钮设置
IBOutlet
并在按钮的isEnabled
属性. 时更改值来完成此操作
timer
可以为 nil 会更有意义
我认为如果有定时器,你需要做的是使它无效运行
@IBAction func start(_ sender: AnyObject) {
if (timer) {
timer.invalidate()
}
timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(ViewController.action), userInfo: nil, repeats: true)
}
@IBOutlet weak var lbl: UILabel!
var time = 0
var timer : Timer?
var isPause = false
@IBOutlet weak var start: UIButton!
@IBOutlet weak var stop: UIButton!
@IBOutlet weak var pause: UIButton!
@IBAction func start(_ sender: AnyObject) {
timer?.invalidate()
timer = nil
isPause = false
time = 0
lbl.text = "0"
// or call stop(self.stop)
timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(ViewController.action), userInfo: nil, repeats: true)
}
@IBAction func stop(_ sender: AnyObject) {
timer?.invalidate()
timer = nil
isPause = false
time = 0
lbl.text = "0"
}
@IBAction func pause(_ sender: AnyObject) {
timer.invalidate()
isPause = !isPause // second click to resum...
}
override func viewDidLoad() {
super.viewDidLoad()
}
func action() {
if !isPause {
time += 1
lbl.text = String(time)
}
}
源代码中的一个错误。
首先停止现有定时器,然后启动新定时器。
代码如下。
@IBAction func start(_ sender: AnyObject) {
timer.invalidate()
timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(ViewController.action), userInfo: nil, repeats: true)
}
并且对于停止定时器使用无效定时器功能。
@IBAction func stop(_ sender: AnyObject) {
timer.invalidate()
}