2016-10-20 3 views
1

Я пытаюсь сделать простой таймер в iOS с помощью Swift. Программа работает нормально, но всякий раз, когда нажимается START UIButton, функция таймера запускается и выполняется несколько раз столько же, сколько нажата кнопка.Простой таймер в iOS

Я хочу отключить START UIButton, как только начнется функция таймера, чтобы она не запускалась несколько раз.

Пожалуйста, помогите мне за то же самое.

Это мой код ViewController

import UIKit 

class ViewController: UIViewController { 
    var time = 0.0 
    var timer = Timer() 

    @IBOutlet weak var lbl: UILabel! 

    @IBAction func start(_ sender: UIButton) 
    { 
     timer = Timer.scheduledTimer(timeInterval: 0.1, target: self, selector: #selector(ViewController.action), userInfo: nil, repeats: true) 
    } 

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

    @IBAction func reset(_ sender: UIButton) 
    { 
     timer.invalidate() 
     time = 0.0 
     lbl.text = ("0") 
    } 

    func action() 
    { 
     time += 0.1 
     lbl.text = String(time) 
    } 

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

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

Вы можете просто отключить кнопку в методе start() –

ответ

3

Чтобы отключить кнопку, вы можете просто установить его isUserInteractionEnabled свойство в start функции:

@IBOutlet weak var startButton: UIButton! 

@IBAction func start(_ sender: UIButton) { 
    timer = Timer.scheduledTimer(timeInterval: 0.1, target: self, selector: #selector(ViewController.action), userInfo: nil, repeats: true) 
    startButton.isEnabled = false 
} 

Затем установите его обратно верно в pause и reset методов :

@IBAction func pause(_ sender: UIButton) { 
    timer.invalidate() 
    startButton.isEnabled = true 
} 

@IBAction func reset(_ sender: UIButton) { 
    timer.invalidate() 
    startButton.isEnabled = true 
    //the rest of your code 
} 
+0

Было бы лучше установить свойство 'enabled' кнопки вместо использования' userInteractionEnabled'. И это будет 'button.userInteractionEnabled = true', а не' button.isUserInteractionEnabled = true'. Вы не хотите вызывать сеттер, используя геттер. – rmaddy

+0

@rmaddy Полностью согласен с первым утверждением, но не со вторым. Поскольку swift 3 переименовывается, а 'button.userInteractionEnabled = true' даже не компилируется. – alexburtnik

+0

@rmaddy Это похоже на намеренное переименование для всех свойств Bool. enabled-> isEnabled также переименован, а также скрытый, непрозрачный, сфокусированный и множество других;) – alexburtnik

2

Самый надежный способ убедиться, что таймер только запущен и остановлен один раз пишет два метода, которые проверяют текущее состояние (таймер не nil, если он в настоящее время работает):

var timer : Timer? 

func startTimer() 
{ 
    guard timer == nil else { return } 
    timer = Timer.scheduledTimer(timeInterval: 0.1, target: self, selector: #selector(ViewController.action), userInfo: nil, repeats: true) 
    // disable start button 
} 

func stopTimer() 
{ 
    guard timer != nil else { return } 
    timer!.invalidate() 
    timer = nil 
    // enable start button 
} 

В методах Вы можете включить/соответственно отключите кнопку (и).

Смежные вопросы