Могу ли я сохранить ту же позицию в моем tableView после перезагрузки данных? - PullRequest
0 голосов
/ 13 января 2020

У меня проблемы с моим tableView после того, как я перезагрузил Data (). Это всегда прокручивается к вершине. Я не знаю, где я все испортил, потому что раньше он работал очень хорошо, поддерживая позицию смещения.

Я использую автоматическое измерение c.

var currentCount: Int {
   return news.count
 }
tableView.rowHeight = UITableView.automaticDimension
tableView.estimatedRowHeight = 200
 func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
    if !fetchingMore && indexPath.row == currentCount - 1 {
      beginBatchFetched()
   }
 }

 func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    return tableView.estimatedRowHeight
 }

 func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat {
    return 200
 }
private func beginBatchFetched() {
  fetchingMore = true
  customGetAllNews(serchKey: qKey, tags: tagsAsParameter, cameFromPullToRefresh: false)
}
private func customGetAllNews(serchKey: String?, tags: [String]? = nil,....) {

  Helper.getAllNews(page: self.currentPage, key: serchKey........) { (data) in
    self.fetchingMore = false

    guard let nws = data?.news else {return}
    self.currentPage += 1
    self.news.append(contentsOf: nws)

    GlobalMainQueue.async {
      self.tableView.reloadData()
   }
 }

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

Кроме того, я попробовал метод с heightDictionary: [Int : CGFloat] = [:]

override func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
    heightDictionary[indexPath.row] = cell.frame.size.height
}

override func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat {
    let height = heightDictionary[indexPath.row]
    return height ?? UITableViewAutomaticDimension
}

, но безуспешно, результат было то же самое, прыгает на вершину таблицы.

1 Ответ

3 голосов
/ 13 января 2020

@ Мохамед, пожалуйста, посмотрите приведенный ниже код и поместите его в свою главную очередь вместо перезагрузки данных.

Пожалуйста, проверьте и дайте мне знать, если это работает для вас.

GlobalMainQueue.asyn c {self.tableView.reloadData ()}

UIView.setAnimationsEnabled(false)
self.tableView.beginUpdates()
self.tableView.reloadSections(IndexSet(index: 1) as IndexSet, with: 
UITableViewRowAnimation.none)
self.tableView.endUpdates()
...