У меня есть приложение с UITableView
, и его данные регулярно обновляются. Если данные получают новый элемент, представление таблицы перезагружается. Допустим, табличное представление имеет место для 10 видимых ячеек, но данные только для 2 из них. Пользователь прокрутил в любом направлении и не отменил вид таблицы от прикосновения. Если пользователь прокрутил вверх, возможно, он спрятал первую ячейку, и будет видна только вторая. Затем принимается новый элемент и вызывается reloadData. Вместо ожидания освобождения табличного представления для обновления, табличное представление обновляется сразу же, и contentOffset
сбрасывается в 0. TableView просто сбрасывается в исходное положение, пока пользователь прокручивает и не отпускает.
Я пробовал подобную настройку в отдельном проекте XCode, и проблема там не появляется. Интересно, какая разница может быть.
Это часть кода:
Для ViewController
, то есть dataSource
:
func viewDidLoad() {
super.viewDidLoad()
//some other code
DataManager.shared.onElementReceival = { [weak self] in
guard let self = self else { return }
DispatchQueue.main.async {
self.tableView.reloadData()
}
}
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return DataManager.shared.data.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "reuseIdentifier", for: indexPath)
cell.textLabel?.textColor = .white
cell.backgroundColor = .clear
if let name = DataManager.shared.data[indexPath.row].name {
cell.textLabel?.text = name
} else {
cell.textLabel?.text = "Unnamed"
}
return cell
}
Из DataManager
func didReceive(_ element: Element) {
data.append(element)
onElementReceival()
}