Подтвердить что ты не робот

Как остановить NSTimer.scheduledTimerWithTimeInterval

Как я могу остановить мой таймер от запуска? Не как пауза, а остановка.

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()
}

}

Я могу запустить таймер, но когда я нажимаю кнопку "Стоп", он сам reset и снова начинает подсчет. Это не останавливается.

Сделал работу. Что-то было плохо с моим проектом! Исправлено, удалив кнопку и повторно добавив ее. Похоже, у меня был дубликат или что-то в этом роде.

4b9b3361

Ответ 1

Вам не нужно использовать 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 таймер переменной экземпляра после его недействительности, он избегает дальнейшей путаницы, если вам нужно создать еще один таймер с той же переменной. Кроме того, имена методов и переменные должны начинаться с строчной буквы.

Снимок экрана, чтобы показать таймер недействительным и установить на нуль.

screenshot

Обновление для Swift 2.2 +

См. fooobar.com/questions/137199/... для нового синтаксиса #selector, заменяющего Selector().

Ответ 2

вы можете использовать это, когда какое-либо условие выполнено, и вы хотите остановить таймер:

Timer.invalidate()

Вот простой пример:

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

это остановит таймер.

Вы можете изменить его в соответствии с вашими потребностями.

Ответ 3

Как pre Swift 2.2

let printTimer = NSTimer.scheduledTimerWithTimeInterval(2.0, target: self, selector: #selector(printDescription), userInfo: nil, repeats: true)

func printDescription() {
    print("Print timer will print every after 2.0 seconds")
}

Таймер печати будет печатать каждые 2,0 секунды