Swift: Как мгновенно перезагрузить данные в UITableViewController? - PullRequest
0 голосов
/ 30 апреля 2019

У меня есть несколько записей (ячеек) в UITableView в Swift, каждая из которых представляет «песню», которую может выбрать каждый пользователь. Названия песен, которые еще не были завершены, обозначены вопросительными знаками, а остальные отображаются нормально. Песни, завершенные пользователем, хранятся в базе данных firebase, которая сразу же читается в начале жизненного цикла UITableViewController и сохраняется в глобальном словаре, который я назвал temp_dict.

Словарь temp_dict имеет вид

Key = "02": Value = "Complete", Ключ = "03": Значение = "Завершено", и т.д.

Проблема в том, что загрузка данных в этот словарь происходит не сразу и при первоначальном вызове следующей функции «загрузка ячеек»:

переопределить функцию tableView (_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {}

происходит до того, как у меня есть информация из базы огня, чтобы решить, какие из них были завершены или нет.

Сейчас я нахожусь в странной ситуации, когда вопросительные знаки появляются только после того, как я прокручиваю вниз (там около 30 ячеек), а затем снова прокручиваю вверх. Я считаю, что это происходит потому, что каждая ячейка удаляется и добавляется снова, когда она удаляется и появляется на экране

Что я пробовал: я пытался использовать self.tableView.reloadData () на разных этапах, но по какой-то причине он ничего не делает.

class MainTableViewController: UITableViewController {

...

override func tableView(_ tableView: UITableView, cellForRowAt 
indexPath: IndexPath) -> UITableViewCell {
        let myCell = tableView.dequeueReusableCell(withIdentifier: "cell", 
for: indexPath)
        myCell.textLabel?.text = songs[indexPath.row].title
        myCell.detailTextLabel?.text = songs[indexPath.row].artist
        if (self.temp_dict[String(indexPath.row+1)] != "Complete") {
            myCell.textLabel?.text = question_marks(s : 
songs[indexPath.row].title)
            myCell.detailTextLabel?.text = question_marks(s : 
songs[indexPath.row].artist)
        }
        num_times_called = num_times_called + 1
        return myCell
    }

...

}
  • Функция question_marks () просто берет строку и заменяет каждый символ знаком вопроса, чтобы показать, что уровень еще не пройден и поэтому скрыт.

** песни - это массив объектов песен, которые имеют атрибуты названия, исполнителя, номера песни и т. Д.

Результаты:

Прямо сейчас, я приветствую, когда все ячейки полностью состоят из вопросительных знаков, когда я запускаю этот view-контроллер. Когда я прокручиваю до конца и возвращаюсь назад, песни, которые были закончены, теперь внезапно отображаются как больше не вопросительные знаки (это то, что я хочу, но я хочу, чтобы это произошло немедленно).

Резюме:

Мне нужен способ для автоматической перезагрузки всех ячеек в uitableview сразу после появления определенного события.

Спасибо за любую помощь.

Ответы [ 2 ]

1 голос
/ 30 апреля 2019

Mr.P ответ почти правильный. Я предлагаю перезагрузить просмотр таблицы в главном потоке:

var temp_dict: [String: String] {
    didSet {
        DispatchQueue.main.async {
            tableView.reloadData()
        }
    }
}
0 голосов
/ 30 апреля 2019

Добавьте наблюдателя свойства к вашему temp_dict объекту, чтобы он автоматически перезагружал табличное представление при его обновлении

var temp_dict: [String: String] {
    didSet {
        tableView.reloadData()
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...