Быстрый таймер обратного отсчета Логика

Я создаю таймер обратного отсчета по дням, часам и секундам. В настоящее время я храню их в массиве строк, а также преобразовываю их в Int (используя map() ), чтобы я мог выполнять обратный отсчет/уменьшение при преобразовании значений в метку.

Текущий вывод при печати в журналы: ["[68168]", "[68188]", "[68243]", "[68281]"]

У меня возникли проблемы с формированием логики функции countDown, так что, когда секунды достигают «0», 1 минута уменьшается, а через 59 минут 1 час уменьшается и т. д., пока не достигнет «00:00:00».

В каждом индексе у меня есть 3 значения [час, минута, секунда]. Но у меня есть несколько индексов.

На данный момент беру Час * 3600, минут * 60 + секунда. Мой вопрос в том, как я могу разделить это и разбить его в функции countDown...

Вот мой код:

   //Here I'm querying and converting the objects into Hour, Minute, Seconds.

 var createdAt = object.createdAt
            if createdAt != nil {

                let calendar = NSCalendar.currentCalendar()
                let comps = calendar.components([.Hour, .Minute, .Second], fromDate: createdAt as NSDate!)
                let hour = comps.hour * 3600
                let minute = comps.minute * 60
                let seconds = comps.second
                let intArray = [hour, minute, seconds]

                //Now i'm appending to the String array below. 

                self.timeCreatedString.append("\(intArray)")

               var timer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: Selector("countDown"), userInfo: nil, repeats: true)


            }


             func countDown() {

                     //completely stuck as to how to decrement/divide up the values so that I can display it as: 23:49:01 (Hours, minutes, seconds). 

                 }

Как я могу сформировать его так, чтобы каждый элемент в каждом индексе отсчитывался отдельно? пример: "23:59:59"

PS, это построено на TableViewController. Я хочу напечатать это на метке, которая находится в контроллере представления cell в методе cellForRowAtIndexPath


person Lukesivi    schedule 28.10.2015    source источник


Ответы (1)


Храните время обратного отсчета в секундах в одной переменной с именем countdown:

var countdown = 7202 // two hours and two seconds

Когда придет время отобразить его, разбейте его на hours, minutes и seconds и используйте конструктор String(format:) для его форматирования:

// loop 5 times to demo output    
for _ in 1...5 {
    let hours = countdown / 3600
    let minsec = countdown % 3600
    let minutes = minsec / 60
    let seconds = minsec % 60
    print(String(format: "%02d:%02d:%02d", hours, minutes, seconds))
    countdown--
}

Вывод:

02:00:02
02:00:01
02:00:00
01:59:59
01:59:58

Если у вас более одного таймера, сохраните их в массиве:

// Array holding 5 different countdown timers referred to as
// timers[0], timers[1], timers[2], timers[3] and timers[4]
var timers = [59, 61, 1000, 3661, 12345]

for i in 0 ..< times.count {
    let hours = timers[i] / 3600
    let minsec = timers[i] % 3600
    let minutes = minsec / 60
    let seconds = minsec % 60
    print(String(format: "%02d:%02d:%02d", hours, minutes, seconds))
}

Вывод:

00:00:59
00:01:01
00:16:40
01:01:01
03:25:45
person vacawama    schedule 28.10.2015
comment
Что, если мне нужно запросить количество x разных дат с разным временем? Как я могу сохранить их все в переменной? Разве это не должно быть сделано через массив? - person Lukesivi; 28.10.2015
comment
Конечно, вы можете сделать countdown массив времен var countdown = [Int](), тогда вы будете обращаться к каждому из них по индексу, например countdown[0], countdown[1] и т. д. Просто замените countdown в приведенной выше логике на countdown[n], где n — это индекс таймера, который вы сейчас форматируете. . Если у вас есть фиксированное количество таймеров, например 5, вы можете просто сделать var countdown = [0,0,0,0,0]. Если вы хотите выделить место для n таймеров, то var countdown = [Int](count: n, repeatedValue: 0). - person vacawama; 28.10.2015
comment
Кстати, спасибо за ответ... Как это будет работать с массивом intArray/timeCreatedString, который у меня есть? Как бы я разделил этот массив, к которому я добавляю, как вы сделали в приведенном выше ответе с переменной? Код работает, когда у меня есть только переменная, но я не понимаю, как сделать то же самое, но только для значений индекса в массиве... - person Lukesivi; 28.10.2015
comment
Смотрите обновленный ответ. Каждый элемент массива содержит текущее значение 1 таймера в секундах. При отображении значение разбивается на часы, минуты и секунды. - person vacawama; 28.10.2015
comment
Эй, один вопрос: когда я печатаю в журналах значение массива, я получаю полные числа без формата. Как его отформатировать без использования метода print(format())? В конечном счете, у меня проблемы с размещением его в пользовательском интерфейсе. Я просто получаю первое необработанное числовое значение времени: 6871, и оно не движется. Это происходит в cellForRowAtIndexPath следующим образом: myCell.secondLabel.text = ("\(timerInt[indexPath.row])") есть идеи, как отформатировать/запустить таймер и здесь? - person Lukesivi; 28.10.2015
comment
как отформатировать массив? У меня много проблем... Просто могу печатать в журналы... - person Lukesivi; 28.10.2015
comment
Чтобы настроить место для 20 таймеров: добавьте это свойство в класс вашего контроллера представления: var timerInt = [Int](count: 20, repeatedValue: 0). В цикле countDown() по этому массиву уменьшаются все таймеры. Вам нужно вызвать tableView.reloadData(), чтобы отображаемые строки отображались повторно. Настройте свою метку следующим образом: myCell.secondLabel.text = String(format: "%02d:%02d:%02d", hours, minutes, seconds)) после вычисления hour, minutes и seconds из timerInt[indexPath.row]. - person vacawama; 28.10.2015
comment
Я добавил переменные часов, минут и секунд из функции countDown в cellForRowAtIndexPath, чтобы вычислить три из timerInt[indexPath.row]. Секунды отсчитываются, теперь отсчитываются на 3. - person Lukesivi; 29.10.2015
comment
Только функция countDown должна уменьшать значения таймеров. CellForRowAtIndexPath должен форматировать их только для отображения. - person vacawama; 29.10.2015
comment
Давайте продолжим обсуждение в чате. - person Lukesivi; 29.10.2015
comment
В журналах я вижу, что таймер печатает правильно. Но на этикетке обратный отсчет до 3. Не понимаю, почему так происходит... - person Lukesivi; 29.10.2015
comment
Получил ответ. Мой метод таймера был не в том месте. Я поместил это вне запроса. Его опрашивали 3 раза. - person Lukesivi; 29.10.2015
comment
stackoverflow.com/questions/33414661/ - person Lukesivi; 29.10.2015