2015-10-29 1 views
0

Я пытаюсь сделать приложение pomodoro на Apple Watch (OS2). Я хочу вызвать уведомление после окончания обратного отсчета, на первом этапе я пытаюсь напечатать несколько слов на консоли, но он все равно не работает. Как использовать NSTimeInterval, чтобы получить оставшееся время для этого?Используйте NSTimeInterval для запуска уведомления в WatchOS2

import WatchKit 
    import Foundation 


    class InterfaceController: WKInterfaceController { 

let countdown:NSTimeInterval = 1501 

var timerRunning = false 

@IBOutlet var pauseButton: WKInterfaceButton! 

@IBOutlet var timer: WKInterfaceTimer! 

override func awakeWithContext(context: AnyObject?) { 
    super.awakeWithContext(context) 
} 

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

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

@IBAction func startPomodoro() { 

    let date = NSDate(timeIntervalSinceNow: countdown) 
    timer.setDate(date) 
    timer.start(); 
    WKInterfaceDevice.currentDevice().playHaptic(.Start) 
    WKInterfaceDevice.currentDevice().playHaptic(.Start) 
} 


@IBAction func resetPomodoroTimer() { 
    timer.stop() 
    let resetCountdown:NSTimeInterval = 1501 
    let date = NSDate(timeIntervalSinceNow: resetCountdown) 

    timer.setDate(date) 
    WKInterfaceDevice.currentDevice().playHaptic(.Retry) 
    WKInterfaceDevice.currentDevice().playHaptic(.Retry) 
} 


@IBAction func pausePomodoro() { 
    timer.stop() 

    if !timerRunning{ 
     pauseButton.setTitle("Restart") 
    } 
    WKInterfaceDevice.currentDevice().playHaptic(.Stop) 
    WKInterfaceDevice.currentDevice().playHaptic(.Stop) 
} 

func showNotification(){ 

    if countdown < 1490 
    { 
     print("Notification") 
     WKInterfaceDevice.currentDevice().playHaptic(.Success) 
     WKInterfaceDevice.currentDevice().playHaptic(.Success) 
    } 
} 
} 

ответ

0

Чтобы активировать уведомление после того, как WKInterfaceTimer закончил вы должны добавить NSTimer с тем же интервалом времени. Вы запускаете оба одновременно, и когда NSTimer срабатывает, вы знаете, что WKInterfaceTimer также завершен. ИМХО, это не очень изящное решение, но это предлагается в документации Apple, поэтому, по-видимому, нет другого способа сделать это.

Если вы хотите добавить функцию паузы/перезапуска, вы должны отслеживать оставшееся время, когда пользователь нажимает «пауза» и останавливает оба таймера. Когда пользователь снова запустит таймер, вы установите оба таймера на оставшееся время и запустите их.

Вот рабочий пример с функцией паузы/повторного запуска (то есть WKInterfaceButton, который подключен к розетке button и didPressButton: действие:

enum TimerState { 
    case Idle, Running, Paused, Finished 
} 

class InterfaceController: WKInterfaceController { 

    let countdownDuration: NSTimeInterval = 10 
    var remainingDuration: NSTimeInterval = 10 
    var timer: NSTimer? 
    var timerState = TimerState.Idle 

    @IBOutlet var interfaceTimer: WKInterfaceTimer! 
    @IBOutlet var button: WKInterfaceButton! 

    @IBAction func didPressButton() { 

     switch timerState { 
     case .Idle: 
      startTimer(remainingDuration: countdownDuration) 
     case .Running: 
      let fireDate = timer!.fireDate 
      remainingDuration = fireDate.timeIntervalSinceDate(NSDate()) 
      interfaceTimer.stop() 
      timer?.invalidate() 
      button.setTitle("Continue") 
      timerState = .Paused 
     case .Paused: 
      startTimer(remainingDuration: remainingDuration) 
     case .Finished: 
      break 
     } 
    } 

    func startTimer(remainingDuration duration:NSTimeInterval) { 
     interfaceTimer.setDate(NSDate(timeIntervalSinceNow: duration)) 
     interfaceTimer.start() 
     timer = NSTimer.scheduledTimerWithTimeInterval(duration, target: self, selector: Selector("timerDidFire:"), userInfo: nil, repeats: false) 
     button.setTitle("Pause") 
     timerState = .Running 
    } 

    func timerDidFire(timer: NSTimer) { 
     interfaceTimer.stop() 
     timerState = .Finished 
     WKInterfaceDevice.currentDevice().playHaptic(.Success) 
    } 
}