2017-04-22 33 views
0

我有一個TableView中的動態單元尺寸:Swift 3 | TableView中ScrollToTop上reloadData動態單元尺寸

tableView.rowHeight = UITableViewAutomaticDimension 
tableView.estimatedRowHeight = 20 

我有一個內部的文本細胞,當然,文字高度可以改變其內容的功能。

有時我只有一條線,有時候我有更多的,這意味着我的細胞有時會有20個高度,有時更多。

我有一個問題,當我嘗試重新加載我的tableview數據並滾動到頂部。

這是我做的:

myTableViewDatas = newDatas 
tableView.setContentOffset(CGPoint.zero, animated: false) 
tableView.reloadData() 

這是很難向你展示這種情況下,但它不會滾動到Y = 0,它滾動到Y = 100或類似的東西。因爲我的單元格大小根據要顯示的內容而變化。

如果我刪除動態大小,做:

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

而且還在滾動到頂部:

myTableViewDatas = newDatas 
tableView.setContentOffset(CGPoint.zero, animated: false) 
tableView.reloadData() 

==>這是工作,我滾動到Y = 0

我認爲我試過任何東西:

  • scrollToRow

  • scrollRectToVisible

  • scrollsToTop

我仍然有問題。 這是工作的唯一方法是,如果我耽誤reloadData

myTableViewDatas = newDatas 
tableView.setContentOffset(CGPoint.zero, animated: false) 
DispatchQueue.main.asyncAfter(deadline: .now() + 0.01) { 
    tableView.reloadData() 
} 

這是工作,但它創造了一個「故障」 =>它顯示了科研數據,然後自動滾動到頂部,這是令人不安的用戶。

另一個解決方案是使用「reloadSections」:

myTableViewDatas = newDatas 
tableView.setContentOffset(CGPoint.zero, animated: false) 
tableView.reloadSections(IndexSet(integer: 0), with: .none) // I have only one section 

它也能工作,但它也創造了「故障」,這就像TableView中與動畫(即使我設置.none重裝)其中顯示的單元格在新數據的功能下縮小/放大。

我真的找不到一個「正確的」解決方案來做到這一點,有沒有人已經遇到過這個問題? TY

+0

如果你改變調用的順序?您可以滾動到頂部,然後重新加載數據。 – Holly

+0

@霍利感謝您的回答,如果我改變了調用的順序=>沒有任何事情發生,滾動到頂端的唯一方法是如果我將contentOffset設置爲0,然後重新加載數據。 – Aximem

+0

你從哪個線程執行代碼? – Holly

回答

0

那麼,有時您會搜索複雜的解決方案,而且事實上它很簡單。 我所做的: - 重裝第一 - scrollToIndexPath0秒 - >它的工作原理

myTableViewDatas = newDatas 
tableView.reloadData() 
tableView.scrollToRow(at: IndexPath(row: 0, section: 0), at: .top, animated: false)