Search code examples
swiftstringxcodetimercountdowntimer

How Can I Make A Timer Using String In xCode


So I'm trying to make a chess timer. I'm using string to make the 00:00 in a variable called storeTimed. Is there a way possible to make that used an timer to count down from that?

Here's my code:

The part I need help with is the updateTimer() function. Since the storedTime is a string trying to pass as a Int, xCode isn't liking it. I'm honestly not very sure what I could do. Mostly at the else statement, but the whole part in general


class ChessTimer: UIViewController {

    @IBOutlet weak var playerTimer1: UILabel!
    @IBOutlet weak var playerTimer2: UILabel!
    
    var timer = Timer()
    
    var time = 10
    var isTimerRunning = false
    
    var storedTime = "00:00"
    override func viewDidLoad() {
        super.viewDidLoad()

       if isTimerRunning == false {
           runTimer()
       }
        
        
    }

    @IBAction func restartButton(_ sender: UIButton) {
        
        
        
    }
    
    @IBAction func pausePressed(_ sender: UIButton) {
        timer.invalidate()
    }
    
    @IBAction func settingsPressed(_ sender: UIButton) {
        
        performSegue(withIdentifier: "goToSettings", sender: self)
        
    }
    
    func runTimer() {
        timer = Timer.scheduledTimer(timeInterval: 1, target: self,selector: (#selector(ChessTimer.updateTimer)),userInfo: nil, repeats: true)
           isTimerRunning = true
       }
    
    @objc func updateTimer() {
        if Int(storedTime) < 1 {
             timer.invalidate()
            playerTimer1.text = "00:00"
            playerTimer2.text = "00:00"
         }
            else {
        Int(storedTime)! -= 1
       playerTimer1.text = prodTimeString(time: TimeInterval(storedTime)!)
        
        }
        
     }
    
    func prodTimeString(time: TimeInterval) -> String {
        let prodMinutes = Int(time) / 60 % 60
        let prodSeconds = Int(time) % 60

        return String(format: "%02d:%02d", prodMinutes, prodSeconds)
    }
    
    
    @IBAction func playerButton1(_ sender: UIButton) {
    }
    
    
    @IBAction func playerButton2(_ sender: UIButton) {
    }
    
    
    @IBAction func unwindToVC1(sender: UIStoryboardSegue) {
        
        
        if let settingsController = sender.source as? SettingsController {
            playerTimer1.text = settingsController.storedTime
            playerTimer2.text = settingsController.storedTime
            
            storedTime = settingsController.storedTime
        
        }
    
   }

}


Solution

  • To keep things simple, here's the code. I have removed the functions that aren't relevant to the discussion - non-implemented buttons, etc.,

    The simple idea is that you use numbers (Int / Double / whatever) to store variables that you are counting with, and then have helper functions to present the variable in different formats

    import UIKit
    
    class ChessTimer: UIViewController {
        var timer = Timer()
    
        var isTimerRunning = false
    
        var storedTime : Int = 0 // use an integer to store the time
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
           if isTimerRunning == false {
               runTimer()
           }
        }
    
        func runTimer() {
            timer = Timer.scheduledTimer(timeInterval: 1, target: self,selector: (#selector(ChessTimer.updateTimer)),userInfo: nil, repeats: true)
           isTimerRunning = true
       }
    
        @objc func updateTimer() {
            // because we're storing the value in an Int, we don't need to convert it here
            storedTime -= 1
            if storedTime < 1 {
                timer.invalidate()
                // use the helper function to format the result for zero time as well as everything else
                // that way, if you ever change it, you only have to change in one place
                playerTimer1.text = prodTimeString(0)
                playerTimer2.text = prodTimeString(0)
             }
             else {
                playerTimer1.text = prodTimeString(storedTime)
              }
         }
    
        func prodTimeString(_ time: Int) -> String {
            // because there's only one parameter, and it's obvious, add '_' then you don't need the label when you call it
            let prodMinutes = time / 60 % 60
            let prodSeconds = time % 60
    
            return String(format: "%02d:%02d", prodMinutes, prodSeconds)
        }
    }