scb998
scb998

Reputation: 909

setting the countdown interval of a WatchKit timer

New to watch development however....

My app gets the user to select a duration for a countdown timer using a slider on one interface controller as shown below:

class game_settings: WKInterfaceController {

    @IBOutlet weak var halflength: WKInterfaceSlider!

    @IBOutlet weak var halflengthdisplay: WKInterfaceLabel!

    @IBOutlet var sethalflengthbutton: WKInterfaceButton!


    @IBAction func halfsliderdidchange(value: Float) {

        halflengthdisplay.setText("\(value)")
    }



    override func contextForSegueWithIdentifier(initialhalftogame: String) -> AnyObject? {
        // You may want to set the context's identifier in Interface Builder and check it here to make sure you're returning data at the proper times

        // Return data to be accessed in ResultsController
        return self.halflengthdisplay
    }

}

i got this from the following question: Passing data question

then i want the selected interval to be used for the timer on another interface controller as shown below.

class main_game_controller: WKInterfaceController {

    @IBOutlet weak var WKTimer: WKInterfaceTimer!//timer that the user will see

    var internaltimer : NSTimer?
    var ispaused = false
    var elapsedTime : NSTimeInterval = 0.0
    var StartTime = NSDate()

    @IBOutlet var extratime_button: WKInterfaceButton!
    @IBOutlet var endgame_button: WKInterfaceButton!
    @IBOutlet var sanction_button: WKInterfaceButton!
    @IBOutlet var goal_button: WKInterfaceButton!
    @IBOutlet var additional_time_timer: WKInterfaceTimer!
    @IBOutlet var reset_timer_button: WKInterfaceButton!
    @IBOutlet var stop_timer_button: WKInterfaceButton!
    @IBOutlet var Start_timer_button: WKInterfaceButton!

    override func awakeWithContext(context: AnyObject?) {
        super.awakeWithContext(context)
        var halflengthinterval : NSTimeInterval// variable was written to, but never read
        // Configure interface objects here.
        if let halflength: String = context as? String {
            halflengthinterval  = Double(halflength)!

        }


    }

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

@IBAction func Start_button_pressed() {

        internaltimer = NSTimer.scheduledTimerWithTimeInterval(halflengthinterval, target:self, selector: Selector("timerdone"), userInfo: nil, repeats:false) //use of unfesolved identifier"halflengthinterval"
        WKTimer.setDate(NSDate(timeIntervalSinceNow: halflengthinterval))
        WKTimer.start()//use of unresolved identifier "halflengthinterval"


    }

    @IBAction func stop_timer_button_pressed() {
        if ispaused{
            ispaused = false
            internaltimer = NSTimer.scheduledTimerWithTimeInterval(halflengthinterval - elapsedTime, target: self, selector:  Selector("timerDone"), userInfo: nil, repeats: false)//use of unresolved identifier 'halflengthinterval'
            WKTimer.setDate(NSDate(timeIntervalSinceNow: halflengthinterval - elapsedTime))//use of unresolved identifier 'halflengthinterval'
            WKTimer.start()
            StartTime = NSDate()
            stop_timer_button.setTitle("Pause")
        }
        else{
            ispaused = true

            //get how much time has passed before they paused it
            let paused = NSDate()
            elapsedTime += paused.timeIntervalSinceDate(StartTime)

            //stop watchkit timer on screen
            WKTimer.stop()

            //stop internal timer
            internaltimer!.invalidate()

            //ui modification
            stop_timer_button.setTitle("Resume")
        }
    }

I was following the answer provided in this question: WKInterface implementation

as you can see in the commented lines above, I'm receiving several errors associated with the variable halflengthinterval. I get the feeling that I'm not correctly passing the interval value between the two interface controllers, but for the life of me i have no idea how to do it.

Could someone please help me in showing

  1. how to pass the value for the timer from the first interface controller to the second interface controller and
  2. how to correctly set the countdown timer for the length of time selected by the slider in the first interface controller.

Thanks very much!

Upvotes: 1

Views: 538

Answers (1)

Victor Sigler
Victor Sigler

Reputation: 23451

Let's fix first the error regarding to NSInterval, NSInterval is just a typealis for the type Double:

typealias NSTimeInterval = Double

So the problem you're facing is how to convert a String to a Double and the way is using the Double constructor like in this way:

Double(IntValue)

Regarding how to pass data from two WKInterfaceController you're doing in the right way, but you have one mistake to fix. If you want to pass data from one WKInterfaceController to another WKInterfaceController using segues you can use the contextForSegueWithIdentifier, but in your case you are returning a NSInterval type or Double and then you're trying to cast as an String and this fail in this line of code always:

// Configure interface objects here.
if let halflength: String = context as? String {
   halflengthinterval  = Double(halflength)!
}

You have to change it to this line instead using the guard statement if you like or using optional-binding, it's up to you:

guard

guard let halflength = context as? Double else {
    return
}

self.halflengthinterval  = Double(halflength)

optional-binding

if let halflength = context as? Double {
   self.halflengthinterval  = Double(halflength)
}

I hope this help you.

Upvotes: 1

Related Questions