UITableView сбрасывается в исходное положение до того, как пользователь отпустил его - PullRequest
0 голосов
/ 20 июня 2019

У меня есть приложение с 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()

}

1 Ответ

0 голосов
/ 20 июня 2019

Попробуйте перезагрузить только ячейку, используя:

tableview.insertRowsAtIndexPaths([IndexPath(forRow: Yourarray.count-1, inSection: 0)], withRowAnimation: .Automatic)

В вашем примере:

let onElementReceival:(IndexPath) -> Void = { [weak self] inx in      
      guard let self = self else { return }
      DispatchQueue.main.async {
           tablview.beginUpdates()
           tablview.insertRowsAtIndexPaths(at: [inx], with: .automatic)
           tablview.endUpdates()
      }
} 

Из DataManager

func didReceive(_ element: Element) {

    data.append(element)
    onElementReceival(IndexPath(row:data.count, section: 0))

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