簡體   English   中英

無法使計時器迅速失效

[英]Can't invalidate timer swift

在我的應用程序中,我應該使用多個計時器,但是我不想為每個功能添加單獨的計時器,我如何創建一個簡化創建多個計時器的功能,我在下面嘗試了此代碼,它可以正常工作,但是我不能使計時器無效。

import UIKit

class ViewController: UIViewController {

@IBOutlet weak var first: UILabel!

@IBOutlet weak var second: UILabel!

  var count = 0
  var count2 = 0

  var timer = Timer()
  var timer2 = Timer()

 override func viewDidLoad() {
    super.viewDidLoad()

    timerWithDifferentIntervals(myTimer: timer, interval: 1, target: self, selector: #selector(handle1), userInfo: nil, repeats: true)

    timerWithDifferentIntervals(myTimer: timer2, interval: 1/6, target: self, selector: #selector(handle2), userInfo: nil, repeats: true)
}

func handle1() {
    count += 1
    first.text = "\(count)"
}

func handle2() {
    count2 += 1
    second.text = "\(count2)"
}


func timerWithDifferentIntervals(myTimer: Timer, interval: TimeInterval, target: Any, selector: Selector, userInfo: Any?, repeats: Bool) {
    var timers = myTimer
    timers = Timer.scheduledTimer(timeInterval: interval, target: target, selector: selector, userInfo: userInfo, repeats: repeats)
}


@IBAction func stop(_ sender: UIButton) {
    timer.invalidate()
    timer2.invalidate()
}

}

您實際上從未為變量分配新值。 您創建的計時器不會保存在任何地方,因此您不能使它們無效。

我建議進行以下更改:

var timer: Timer? {
   didSet {
      oldValue?.invalidate()
   }
}
var timer2: Timer? {
   didSet {
      oldValue?.invalidate()
   }
}

這將確保在分配新計時器時,先前的計時器始終無效。 然后可以使用timer = niltimer2 = nil來使它們無效。

另外,您應該從方法中返回計時器:

func timerWithDifferentIntervals(interval: TimeInterval, target: Any, selector: Selector, userInfo: Any?, repeats: Bool) -> Timer {
  return Timer.scheduledTimer(timeInterval: interval, target: target, selector: selector, userInfo: userInfo, repeats: repeats)
}

並以以下方式使用它:

timer = timerWithDifferentIntervals(interval: 1, target: self, selector: #selector(handle1), userInfo: nil, repeats: true)

盡管該方法現在基本上不執行任何操作,所以沒有必要

在數組中添加NStimers,每個計時器都有自己的標簽。

然后,無論何時要使計時器無效,都可以通過數組訪問它並使它無效。

希望這可以幫助!

我在想您應該使用以下代碼來創建和使計時器無效

var timer : NSTimer?

func startTimer(_ timeInterval: Int, _ isRepeat: Bool)
{
  if timer == nil {
    timer = NSTimer.scheduledTimerWithTimeInterval(timeInterval, target: self, selector: "timerFired", userInfo: nil, repeats: isRepeat)
  }
}

func stopTimer()
{
  if timer != nil {
    timer!.invalidate()
    timer = nil
  }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM