Я только что сделал секундомер с учебником, но то, что я хотел бы сделать, - это обновить мою метку 00:00 в течение 1 секунды, например, 00:01, 00:02: 00:03 и делать то же самое в течение нескольких минут. Есть ли способ сделать это? Заранее спасибо!Обновление от NSTimer до 4-значного знака
ответ
Это Objective-C, но вы получите идею:
-(void) updateTotalTime
{
int forHours = timeInSeconds/3600,
remainder = timeInSeconds % 3600,
forMinutes = remainder/60,
forSeconds = remainder % 60;
[elapsedTime setString:[NSString stringWithFormat:NSLocalizedString(@"elapsedTime", nil)
,forHours
,forMinutes
,forSeconds]];
}
и в моих Localizable.strings:
"elapsedTime" = "Time: %02d:%02d:%02d";
-1 для ObjC, -1 для NSLocalizedString, не запрашивался, -100 для просто кода, когда OP не показывал никакого кода или усилий. – zaph
Тогда вы должны получить дату которого требуется начать подсчет из которого является текущей датой, когда происходит конкретное событие, скажем, мы начнем таймер при появлении представления, поэтому реализуем viewWillAppear следующим образом:
var currentDate = NSDate()
override func viewWillAppear(animated: Bool) {
currentDate = NSDate()
var timer: NSTimer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: "updateLabel", userInfo: nil, repeats: true)
timer.fire()
}
и реализовать функцию updateLabel:
func updateLabel() {
dispatch_async(dispatch_get_main_queue(), {() -> Void in
var elapsedSeconds: NSTimeInterval = -self.currentDate.timeIntervalSinceNow
let minutes: Int = Int(elapsedSeconds)/60
let seconds: Int = Int(elapsedSeconds) - (minutes*60)
self.timeLabel.text = String(format: "%02d:%02d", minutes, seconds)
})
}
OP может использовать таймер. См. Обновленный комментарий выше разницы WRT между двумя датами. Путь к чрезмерному мышлению для простого вопроса. – zaph
Это то же самое, ведь вы перевернете это времяInterval в секунды. – Firas
Учтите, что переменная обновляется по каждому обратному вызову таймера, дата никогда не указана. – zaph
Когда время форматирования истекло, NSDateComponentsFormatter
другой вариант:
var start: CFAbsoluteTime!
override func viewDidLoad() {
super.viewDidLoad()
start = CFAbsoluteTimeGetCurrent()
NSTimer.scheduledTimerWithTimeInterval(0.1, target: self, selector: "handleTimer:", userInfo: nil, repeats: true)
}
lazy var formatter: NSDateComponentsFormatter = {
let _formatter = NSDateComponentsFormatter()
_formatter.allowedUnits = .CalendarUnitMinute | .CalendarUnitSecond
_formatter.zeroFormattingBehavior = .Pad
return _formatter
}()
func handleTimer(timer: NSTimer) {
let elapsed = CFAbsoluteTimeGetCurrent() - start
label.text = formatter.stringFromTimeInterval(elapsed)
}
Правда, это даст вам время, прошедшее в 0:00
формате, не 00:00
формате.
Есть ли вообще что-то делать? Да. Предоставьте код, который вы пробовали, и почему он не работает, написанный код - это то, что делают разработчики. SO - это помощь с кодом, а не с кодом. – zaph