2015-11-03 53 views
2

我試圖在按下按鈕時顯示倒計時(hr,min,sec)方式來獲取倒計時標籤。我試圖連接我找到的兩個不同的代碼。我對Swift非常陌生,對我一無所知。這是我有:在SWIFT中製作合法倒計時器

*updated code (some psuedo code)* 

var timer = NSTimer() 

func timerResults() { 
    let theDate = NSDate() 
    var endTime = theDate //+ 6 hours 
    let timeLeft = endTime - theDate 
    timeLeftLabel.text = "\(timeLeft)" 
} 


@IBOutlet weak var timeLeftLabel: UILabel! 

@IBAction func IBbtnUpdateTap(sender: UIButton){ 

     timer = NSTimer.scheduledTimerWithTimeInterval(1.0, target: self, selector: Selector("timerResults"), userInfo: nil, repeats: true) 

    } 

此外,即使應用程序未運行,我該如何使這種倒計數積極發生?基本上,如果用戶在6個小時內回來,我將創建一個獎勵系統。

回答

3

我不能給出一個長的答案,但現在最簡單的方法如下:

當用戶啓動定時器的秒一些量,計算當計時器應該結束的確切日期(end time = now + amount of seconds) 。現在,您可以使用剩餘的計算時間更新標籤的每個顯示刷新(time left = end time - now)。

這種方式是保證繼續應用程序將重新啓動的時間(當然你需要保存的結束日期與NSUserDefaults或某事),也保證了計時器速度沒有波動(NSTimer將不能保證)

2

你丟失或需要修正的項目下面寫:

var startTime: NSDate = NSDate() 
var endTime: NSDate? 

func viewDidLoad() { 
    let clock = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: "countdown", userInfo: nil, repeats: true) 
    endTime = startTime.dateByAddingTimeInterval(21600) 
} 

func countdown() { 
    printSecondsToHoursMinutesSeconds(Int(timeLeft())) 
} 

func timeLeft() -> Double { 
    return endTime!.timeIntervalSinceNow 
} 

爲了測量時,應用程序沒有運行的時候需要保存的時間,當應用程序進入後臺,然後比較節省的時間當應用程序再次打開。時間可以保存爲NSDate。兩個NSDates之間的比較可以給你一個NSTimeInterval,兩個日期之間經過的秒數。例如:

let remainingTime = savedTime.timeIntervalSinceNow 

用於比較和保存日期NSUserDefaults的進入的地方查看您的應用程序委託applicationDidBecomeActive:applicationDidEnterBackground:

+0

這給了我一個關於我在那裏的「自我」的錯誤。 – adman

+0

嘗試將該行移入「viewDidLoad:」或其他位置。我認爲這個錯誤是由於該行在你的班級中的位置。 – Daniel

+0

手動修改'secondsLeft'是非常不準確的。累積的錯誤將在幾分鐘後可見。保存'startDate'或'endDate'並從當前時間動態計算'secondsLeft'好得多。 – Sulthan