Как обновить UITableViewCells, используя NSTimer и NSNotificationCentre в Swift
ПРИМЕЧАНИЕ: запрашивать ответы встриж Пожалуйста.
Что я пытаюсь сделать:
Обновляйте ячейки таблицы каждые 1 секунду и отображайте обратный отсчет в реальном времени.Как я это делаю сейчас:
У меня есть таблица с ячейками, которые содержат метку.
Когда ячейки генерируются, они вызывают функцию, которая вычисляет время между сегодняшним днем и сохраненной целевой датой, и отображает время обратного отсчета, оставшееся в метке.
Чтобы ячейки обновляли метку каждую секунду, я используюNSTimer
это перезагружает просмотр таблицы каждую секунду.
ПРОБЛЕМА: Обратный отсчет работает, но когда я пытаюсь выполнить действие Swipe-to-Delete, потому чтоNSTimer
перезагружает табличное представление, оно сбрасывает ячейку с измененными значениями, чтобы она больше не смахивалась, и, конечно, это не приемлемо для конечных пользователей.
Что я пытаюсь / Потенциальные решения
Я слышал, что лучший способ сделать это - использоватьNSNotificationCenter
это вызваноNSTimer
и добавьте слушателей в каждую ячейку. Каждую 1 секунду "трансляция" отправляется сNSNotificationCenter
, ячейка получит «трансляцию» и обновит метку.
Я попытался добавить слушателя в каждую ячейку в той части кода, где он генерирует новую ячейку:
// Generate the cells
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
var cell = tableView.dequeueReusableCellWithIdentifier("Tablecell", forIndexPath: indexPath) as UITableViewCell
let countdownEntry = fetchedResultController.objectAtIndexPath(indexPath) as CountdownEntry
// MARK: addObserver to "listen" for broadcasts
NSNotificationCenter.defaultCenter().addObserver(self, selector: "updateCountdownLabel", name: mySpecialNotificationKey, object: nil)
func updateCountdownLabel() {
println("broadcast received in cell")
if let actualLabelCountdown = labelCountdown {
// calculate time between stored date to today's date
var countdownValue = CountdownEngine.timeBetweenDatesRealTime(countdownEntry.date)
actualLabelCountdown.text = countdownValue
}
}
но селектор наблюдателя, похоже, способен нацеливать функции только на уровне контроллера представления, а не в ячейке. (Я не могу заставить "updateCountdownLabel" запускаться изнутри ячейки. Когда я создаю функцию с тем же именем на уровне контроллера представления, функция может быть вызвана)
Вопросы
Итак, мой вопрос: это правильный подход?Если да, как я могу заставить слушателя запускать функцию на уровне ячейки?Если нет, то как лучше всего выполнить обратный отсчет в режиме реального времени, не прерывая действия Swipe on Cell?Заранее спасибо за помощь!