web-dev-qa-db-ja.com

NSTimer.scheduledTimerWithTimeIntervalを停止する方法

どうすればstopタイマーが実行されなくなりますか?一時停止ではなく、停止が好きです。

import UIKit

class LastManStandingViewController: UIViewController {    

@IBOutlet weak var timeLabel: UILabel!
@IBOutlet weak var timeTextbox: UITextField!
@IBOutlet weak var startButton: UIButton!
@IBOutlet weak var stopButton: UIButton!

var myCounter = 0
var myTimer : NSTimer = NSTimer()

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.

    timeLabel.text = String(myCounter)
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

func startTimer(){
    myTimer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: Selector("updateTimer"), userInfo: nil, repeats: true)
    println("func startTimer")
}

func stopTimer(){
    myTimer.invalidate()
    myCounter = 0
    timeLabel.text = String(myCounter)
    println("func stopTimer")
}

func updateTimer(){
    timeLabel.text = String(myCounter++)
    println("func updateTimer")
}
@IBAction func startButton(sender: AnyObject) {
    startTimer()
}
@IBAction func stopButton(sender: AnyObject) {
    stopTimer()
}

}

タイマーを開始することはできますが、[停止]ボタンを押すと自動的にリセットされ、再びカウントを開始します。止まらない。

動作させた。私のプロジェクトには何かバグがありました!ボタンを削除して再度追加することで修正しました。重複または何かがあったようです。

39
Erik Auranaune

Selectorを使用する必要はありません:

_@IBAction func startButton(sender: AnyObject) {
    myTimer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: "updateTimer:", userInfo: nil, repeats: true)
}
_

また、タイマーは選択したメソッドに自身を渡すため、必要な場合はメソッド内でタイマーを無効にできます。

_func updateTimer(timer: NSTimer) {
    timeLabel.text = String(Counter++)
    timer.invalidate()
}
_

または、タイマーがインスタンス変数の場合:

_myTimer.invalidate()
myTimer = nil
_

インスタンス変数のタイマーを無効にした後でnilするのは良いことです。同じ変数で別のタイマーを作成する必要がある場合、それ以上の混乱を避けることができます。また、メソッド名と変数は小文字で始まる必要があります。

タイマーが無効化され、nilに設定されていることを示すスクリーンショット。

screenshot

Swift 2.2 +の更新

Selector()を置き換える新しい_#selector_構文については、 https://stackoverflow.com/a/36160191/222774 を参照してください。

77
ayaio

何らかの条件が満たされ、タイマーを停止する場合にこれを使用できます。

Timer.invalidate()

以下に簡単な例を示します。

func UpdateTimer(){
    timeLabel.text = String(Counter++)
    if timeLabel.text == String("5") {
        Timer.invalidate()
    }
}

これによりタイマーが停止します。

必要に応じて変更できます。

7
Dharmesh