2016-03-03 31 views
0

我正在嘗試創建一個持續時間爲1分鐘的計時器,該計時器每分鐘重複一次,但會在實際時間的下一分鐘開始時啓動(如5:21 :00)。每一個類似的帖子,我發現在這裏,我使用這個代碼是:「完成」無法讓NSTimer在Apple Watch上正常工作

@IBAction func switchEnabled(value: Bool) { 
    if(value){ 
     let date = NSDate() 
     let calendar = NSCalendar.currentCalendar() 
     let components = calendar.components([.Year, .Hour, .Minute, .Second], fromDate: date) 
     components.minute += 1 
     components.second = 0 
     let nextMinuteDate = calendar.dateFromComponents(components) 
     let doneTimer = NSTimer(fireDate: nextMinuteDate!, interval: 60.0, target: self, selector: Selector("timerDone:"), userInfo: nil, repeats: true) 
     NSRunLoop.mainRunLoop().addTimer(doneTimer, forMode: NSDefaultRunLoopMode) 
     // still not working properly 
    } 
    else{ 
     print("switch off") 
     // invalidate timer here 
    } 
} 

我timerDone選擇只是打印出來,但是當我在watchOS 2模擬器上運行這一點,啓動開關,它立即打印完成並且計時器開始一分鐘,所以它不會等待直到開火。關於這裏發生了什麼的任何想法?由於

回答

0
class Test: UIViewController{ 
    override func viewDidLoad() { 
     super.viewDidLoad() 
     let date = NSDate() 
     let calendar = NSCalendar.currentCalendar() 
     let components = calendar.components([.Second], fromDate: date) 
     let delayedStart:Double=(Double)(60-components.second) 
     let dispatchTime: dispatch_time_t = dispatch_time(DISPATCH_TIME_NOW, Int64(delayedStart * Double(NSEC_PER_SEC))) 
     dispatch_after(dispatchTime, dispatch_get_main_queue(), { 
      NSTimer.scheduledTimerWithTimeInterval(60.0, target: self, selector: Selector("timerDone:"), userInfo: nil, repeats: true).fire() 
     }) 
     } 
    func timerDone(myObj:NSObject){ 
      print("Done") 
    } 
} 
  1. 到下一分鐘後究竟火了,首先你需要得到完成的秒數當前分鐘,然後從60減去它來獲得下一分鐘。
  2. 一旦這些秒鐘完成,你必須立即開火。
  3. 然後,你知道如何以一定的時間間隔(在這種情況下60秒)重複計時器。

如果您遇到任何困難,請讓我知道。

+0

非常感謝,這正是我一直在尋找的。所以,正如你所看到的,我將這一切與手錶上的開關聯繫在一起。所以當我關掉開關時,我想讓計時器停下來。在這種情況下,我如何使計時器無效?謝謝。 – alexk403

+0

在你的類中創建一個NSTimer變量,例如var myTimer = NSTimer()。然後執行 - > myTimer = NSTimer.scheduledTimerWithTimeInterval(60.0,target:self,selector:Selector(「timerDone:」),userInfo:nil,repeatats:true)myTimer.fire()。您可以在您的按鈕操作中調用myTimer.invalidate()來停止計時器。 –

+0

順便說一句,你可以給出一個點/標記的答案是正確的,它可能對別人有用 –