Обновите UILabel внутри UITableViewCell без полного обновления страницы с помощью Swift - PullRequest
0 голосов
/ 01 июня 2018

У меня есть определенная загадка, где мне нужно определенное UILabel внутри UITableViewCell для обновления каждую минуту.В настоящее время каждую минуту вся ячейка обновляется и отображается под предыдущей, см. Ниже, все, что я хочу сделать, это обновить UILabel под названием watchTime:

enter image description here

Вот мой табличный вид, где я инициализирую отсчет времени в часах от модели

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "watchTimeCell", for: indexPath) as! WatchTimeCell
    if userModel.count > indexPath.row {
        //this is the value i want to update
        cell.watchTime.text = "\(String(describing: userModel[indexPath.row].watchTime!))"
    }
    return cell
}

А вот как я обновляю свою ячейку в настоящее время:

@objc func updateCounting(){
    watchTime += 1
    if watchTime % 60 == 0 {
        let userRef = Database.database().reference().child("users").child(uid!).child("watchTime")
        userRef.runTransactionBlock({ (currentData: MutableData) -> TransactionResult in
            let newValue: Int

            if let existingValue = (currentData.value as? NSNumber)?.intValue {
                newValue = existingValue + 1
            } else {
                newValue = 1
            }

            currentData.value = NSNumber(value: newValue)

            //this is the line where I reload the cell

            DispatchQueue.main.async(execute: {
                self.watchTableView.reloadData()
            })

            return TransactionResult.success(withValue: currentData)
        })
        watchTime = 0
        }
    }

Что такоелучший способ пойти об этом?Спасибо!

РЕДАКТИРОВАТЬ: Добавлено numberOfRowsInSection

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return userModel.count
}

Ответы [ 2 ]

0 голосов
/ 01 июня 2018

Я бы создал эту одну ячейку со ссылкой на нее в ViewController, который содержит tableView.

let mainCell = WatchTimeCell()

Внутри класса WatchTimeCell я бы добавил публичный функционал для обновления счетчика времени

public func updateTimeCountLabel(_ count: Int) {
 self.nameOfLabel.text = "\(count)"

}

Тогда в рамках updateCounting () я бы вызвал updateTimeCountLabel внутри WatchTimeCell.

self.mainCell.updateTimeCountLabel(newValue)

Но что-то происходит в числеOfRowsForSection, не могли бы вы опубликовать это?

0 голосов
/ 01 июня 2018

То, что вы делаете, по существу правильно для табличного представления.Вы обновляете модель и вызываете reload, чтобы передать это через cellForRowAt в табличное представление.В этой ситуации вы могли бы сэкономить некоторые накладные расходы, вызвав reloadRows(at:with:), чтобы перезагрузить только одну ячейку.

Кроме ...

Вы имеете только однуклетка.Но представление таблицы с одной ячейкой смешно.Какова его цель?Сделать интерфейс прокручиваемым?Тогда просто сделайте вид прокрутки.Теперь вы можете обновить ярлык напрямую.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...