在用户释放UITableView之前,它会重置为开始位置

时间:2019-06-20 09:54:53

标签: ios swift uitableview

我有一个带有UITableView的应用,其数据会定期更新。如果数据接收到新元素,则重新加载表视图。假设表格视图中有10个可见单元格,但其中只有2个是数据。用户已沿任一方向滚动,但未从触摸中释放表格视图。如果用户向上滚动,则他们可能已经隐藏了第一个单元格,只有第二个单元格可见。然后,接收一个新元素并调用reloadData。无需等待释放表视图进行更新,而是立即更新表视图并将contentOffset重置为0。在用户滚动而不释放时,tableView只是重置到开始位置。

我在单独的Xcode项目中尝试了类似的设置,但此问题并未出现。我想知道会有什么不同。

这是一些代码:

对于ViewController的{​​{1}}:

dataSource

通过DataManager

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
}

1 个答案:

答案 0 :(得分:0)

尝试使用以下方法仅重新加载单元格:

UIButton

在您的示例中:

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

从DataManager

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()
      }
}