2015-11-03 1 views
3

Я написал некоторые из них в псевдокоде, потому что я не знаю синтаксиса для него. Я бы хотел, чтобы timeLeftLabel.text отражал, сколько часов, минут и секунд осталось до 6 часов. Моя самая большая проблема заключается в том, что я не знаю, как добавлять и вычитать время. Может кто-нибудь мне помочь?Добавление и вычитание времени в Swift

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) 

} 

ответ

4

Если предположить, что цель развертывания является IOS 8.0 или более поздней версии, вы должны использовать NSDateComponentsFormatter для форматирования строка. Вы хотите что-то вроде этого:

class MyViewController : UIViewController { 

    @IBOutlet weak var timeLeftLabel: UILabel! 

    var targetDate: NSDate? 
    var labelUpdateTimer: NSTimer? 
    var timeLeftFormatter: NSDateComponentsFormatter? 

    @IBAction func startTimerButtonWasTapped() { 
     targetDate = NSDate(timeIntervalSinceNow: 6 * 60 * 60) 
     labelUpdateTimer = NSTimer.scheduledTimerWithTimeInterval(1, 
      target: self, selector: "labelUpdateTimerDidFire:", userInfo: nil, repeats: true) 
     timeLeftFormatter = NSDateComponentsFormatter() 
     timeLeftFormatter?.unitsStyle = .Abbreviated // gives e.g. "1h 20m 34s" 
      // You might prefer .Positional, which gives e.g. "1:20:34" 
     timeLeftFormatter?.allowedUnits = [ .Hour, .Minute, .Second ] 

     labelUpdateTimerDidFire(labelUpdateTimer!) 
    } 

    @objc func labelUpdateTimerDidFire(timer: NSTimer) { 
     let now = NSDate() 
     timeLeftLabel.text = timeLeftFormatter!.stringFromDate(now, 
      toDate: targetDate!) 
     if now.compare(targetDate!) != NSComparisonResult.OrderedAscending { 
      print("times up!") 
      labelUpdateTimer?.invalidate() 
     } 
    } 

} 
+0

Какова цель вашего кода ключевого слова '@ objc'? Есть какая-то конкретная цель или что-то еще? –

+0

Это не требуется в этом случае, но это привычно. –

+0

@rob Это не совсем работает для меня. Когда я нажимаю свою кнопку, мой текст читает «5h 59m 58s» и остается таким, как если бы не считать вниз. Какие-либо предложения? – adman

0

Это добавит 6 часов:

let future = now.dateByAddingTimeInterval(3600*6) // 1 hour is 3600 seconds 

Найдет разницу:

let difference = future.timeIntervalSinceDate(now) 
+0

Никогда не делайте первую строчку. Не все часы имеют 3600 секунд. Однако вторая строка верна для нахождения количества секунд между двумя датами. – rmaddy

+0

@rmaddy wow, я никогда не слышал о часах, которые не имеют 3600 секунд. Можете ли вы предоставить дополнительную информацию об этом? –

+0

@rmaddy Я буду обновлять с помощью NSDateComponents, если он захочет получить дотошный ответ. –