У меня есть таблица с базовой функцией cellforrow. Я также создал функцию таймера для моего списка задач.
Я пытаюсь создать приложение с запущенным таймером обратного отсчета в каждой ячейке таблицы, используя стандартные ячейки субтитров. Имя таймера отображается в текстовом поле, а запущенный таймер отображается в субтитре.
Идея состоит в том, чтобы рассчитать оставшееся время для задачи, когда пользователь устанавливает конкретную дату крайнего срока для выбранной задачи.
Мне удалось реализовать эту функцию успешно, но проблема у меня заключается в том, что, когда я задаю для тега detailtext ячейки (субтитра) оставшееся время (которое отображает оставшиеся дни / часы / минуты / секунды), оно не обновляется.
Подводя итог, я хочу создать функцию таймера обратного отсчета для задачи, которая будет показывать обратный отсчет каждую секунду. Я хочу, чтобы он загружался в viewdidload.
мой таймер правильный? или не в том месте. Я подумал, что было бы целесообразно, чтобы таймер обновил всю таблицу тогда, если бы это была функция inn cellforRow.
Я попробовал таймер в функции cellforrow, но без радости. Затем я сделал отдельную функцию для таймера, чтобы обновить табличное представление с помощью reloadData () внутри него. Эта функция вызывается в viewDidLoad. обратный отсчет и все работает, но мой ярлык просто не обновится, если я не нажму на ячейку или не добавлю новую задачу todo.
override func viewDidLoad() {
super.viewDidLoad()
func startTimer() {
self.countDownTimer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(reloadTableForTimer), userInfo: nil, repeats: true)
}
}
@objc func reloadTableForTimer() {
DispatchQueue.main.async { self.tableView.reloadData() }
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
if item.done == true {
cell.detailTextLabel?.text = "Complete!"
}else {
var deadlineDatesAll = item.deadlineDate
if deadlineDatesAll == "" {
cell.detailTextLabel?.text = "NO DEADLINE SET"
} else {
// insert code for data disection and then to timer to display each countdown:
retrieveDateComponants(deadlineDateChosen: deadlineDatesAll.description)
var dataComponants:Array = retrieveDateComponants(deadlineDateChosen: deadlineDatesAll.description)
var returnedDueDateString = updateTime(yearExtract: dataComponants[0], monthExtract: dataComponants[1], dayExtract: dataComponants[2], hourExtract: dataComponants[3], minExtract: dataComponants[4], secsExtract: dataComponants[5])
cell.detailTextLabel?.text = "Due In: \(returnedDueDateString)"
}
}
cell.accessoryType = item.done == true ? .checkmark : .none
}else {
cell.textLabel?.text = "No Item Found"
}
return cell
}
//UPDATE countdowns function:
@objc func updateTime(yearExtract:String, monthExtract:String, dayExtract:String,hourExtract:String,minExtract:String, secsExtract:String) -> (String) {
var deadlineTimeDueString : String = ""
let futureDate: Date = {
var future = DateComponents(
year: Int(yearExtract),
month: Int(monthExtract),
day: Int(dayExtract),
hour: Int(hourExtract),
minute: Int(minExtract),
second: Int(secsExtract) )
return Calendar.current.date(from: future)!
}()
var countdownComp: DateComponents {
return Calendar.current.dateComponents([.day, .hour, .minute, .second], from: Date(), to: futureDate)
}
let countdown = countdownComp //only compute once per call
let days = countdown.day!
let hours = countdown.hour!
let minutes = countdown.minute!
let seconds = countdown.second!
print((String(format: "OUTPUT TEST: %02d:%02d:%02d:%02d", days, hours, minutes, seconds)))
if seconds < 0 {
deadlineTimeDueString = String("OVERDUE")
} else if seconds > 0 {
deadlineTimeDueString = String(format: "%02d Days, %02d Hours, %02d Mins & %02d Secs", days, hours, minutes, seconds)
}
return deadlineTimeDueString
}
Все работает хорошо, за исключением того, что время обратного отсчета не обновляет метку, если я не нажму вручную на другую или ту же ячейку. Оставшееся время работает и обновляется каждую секунду.
любая помощь будет оценена
Спасибо МФК