2015-11-03 7 views
2

Я пытаюсь получить метку для обратного отсчета при нажатии кнопки, показывая обратный отсчет в течение (hr, min, sec). Я вроде как пытался подключить два разных кода, которые я нашел. Я новичок в Свифт, так голый со мной. Вот что у меня есть:Создание таймера обратного отсчета Legit в 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 

См applicationDidBecomeActive: и applicationDidEnterBackground: в делегат своего приложения на месте, чтобы сравнить и сохранить дату в NSUserDefaults.

+0

Это дает мне ошибку в этом «я», который у меня был там. – adman

+0

Попробуйте переместить эту строку в 'viewDidLoad:' или где-то еще. Я думаю, что ошибка связана с размещением линии в вашем классе. – Daniel

+0

Изменение 'secondLeft' вручную очень неточно. Кумулятивная ошибка будет видна через несколько минут. Гораздо лучше сэкономить «startDate» или «endDate» и вычислить 'secondLeft' динамически с текущего времени. – Sulthan

Смежные вопросы