0
votes

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

}

1
Do not store time as a string. Time is a number. Store a number, manipulate a number. Covert to an outgoing string only for user interface display. - matt
@matt I'm not sure how to make it display as a number though. Right now I have just the interface done. The clock buttons don't even work. I need to find a way to do transfer the timer to the other clock when one is pressed. - WheexyCodes
But that is not what you asked. The question was “Since the storedTime is a string trying to pass as a Int, xCode isn't liking it.” I’m telling you how to approach that. - matt
@matt How do I manipulate it and convert it? - WheexyCodes
@WheexyCodes - all you have to do is change the input parameter in prodTimeString to an Int, and instead of initialising it to - say 02:00, start with a value of 120. as Matt says, work with a number internally, and only make it a string when you need to display - Russell

1 Answers

0
votes

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