Kenny G
Kenny G

Reputation: 107

Stopwatch iOS app w/ concurrent process bug

This is my first post so I hope this is a valid question. I've searched the forums for an answer to this with no luck. Below is my code for a stopwatch app. Problem I am having is when the play button is clicked multiple times it is ticking multiple seconds at a time. How do I safely stop this from happening?

ViewController

import UIKit

class ViewController: UIViewController {
    // MARK: Properties

    @IBOutlet weak var timerLabel: UILabel!

    var timer = NSTimer()
    var time = 0

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    // MARK: Functions
    func increaseTimer() {
        time++
        let formattedTime = String(format:"%02d:%02d", (time/60), time%60)
        timerLabel.text = "\(formattedTime)"
    }

    // MARK: Actions
    @IBAction func btnPlay(sender: AnyObject) {
        timer = NSTimer.scheduledTimerWithTimeInterval(1, target: self,
            selector: Selector("increaseTimer"), userInfo: nil, repeats: true)
    }

    @IBAction func btnStop(sender: AnyObject) {
        timer.invalidate()
    }

    @IBAction func btnReset(sender: AnyObject) {
        timer.invalidate()
        time = 0
        timerLabel.text = "00:00"
    }

}

EDIT: SOVED https://i.sstatic.net/AgARh.jpg

Upvotes: 0

Views: 47

Answers (1)

Duncan C
Duncan C

Reputation: 131418

Make your button into a start/stop button. Use a boolean instance variable to keep track of whether the timer is running or not. If it is, stop it. If it's not, start it.

Alternately, make the code that starts the timer set button.disabled = true

Upvotes: 1

Related Questions