2017-01-19 132 views
2

如何在滾動到頂部時加載更多數據而不會丟失當前偏移量UITableViewUITableView在滾動到頂部時加載更多數據?

這是我想實現:

這是整個組數據:

行1
行2
排3
行4
row 5
行6
行7
行8 *
列9
行10
行11
行12
行13
行14
行15

現在,假設用戶裝載標記爲粗體的那些和偏移量是一個row 8 ,如果用戶向上滾動併到達row 7,我想加載並插入從1到5的行而不從row 7跳轉。請記住,用戶可能正在滾動,所以當數據傳到手機時,它在row 6,所以我不能跳回到row 7,但保持滾動平滑和自然(只是在滾動時加載更多數據時發生的情況,數據被重新加載而沒有tableview從行之間跳轉)。

順便說一下,偏移我的意思是UITableViewcontentOffset財產。

感謝您的幫助,我的確非常感謝!

回答

2

當您更新數據時,您需要先獲取tableView的當前偏移量。然後,你可以添加額外的數據偏移的高度和設置的tableView的像這樣偏移:

func updateWithContentOffsset(data: [String]) { 
    guard let tableView = tableView else { 
     return 
    } 
    let currentOffset = tableView.contentOffset 
    let yOffset = CGFloat(data.count) * tableView.rowHeight // MAKE SURE YOU SET THE ROW HEIGHT OTHERWISE IT WILL BE ZERO!!! 
    let newOffset = CGPoint(x: currentOffset.x, y: currentOffset.y + yOffset) 
    tableView.reloadData() 
    tableView.setContentOffset(newOffset, animated: false) 
} 

您還可以看看我創建的gist。只需打開一個新的iOS遊樂場並複製粘貼要點。

您必須注意的唯一一件事就是確保您知道要將行高添加到偏移量。

+1

謝謝!在回答之前,我試圖計算每一行的偏移量,但是我發現自己有問題,例如偏移之間的跳轉。我認爲這是我試圖計算剛好在'reloadData()'方法之後的偏移量(顯然我保存了以前的偏移量)。 –

1

現在,假設用戶加載了用粗體標記的偏移量,並且偏移量在第8行,如果用戶向上滾動併到達第7行,我想加載並插入1到5行而不跳躍從第7行

將數據加載到表作爲它需要的是那UITableView自動爲您做的事情之一。不要嘗試向表中插入行,因爲用戶會向他們滾動時很快需要這些行 - 表視圖將根據需要從其數據源請求這些行。您只需確保數據源具有所需的信息,以便在單元到達時滿足表請求。

如果填充行需要對每一行進行網絡請求,事情會變得更復雜一些。鑑於你在問題中使用「負荷」的,我不認爲這是你在說什麼,但如果這是你的情況,這裏有一些提示:

  • 要求儘可能多行數據因爲你可以儘早合理地做到這一點。單行顯示的數據量通常很小,因此一次請求幾百行數據不會有什麼大不了的。

  • 如果您沒有給定行所需的數據,請進行必要的請求,但立即返回一個單元格。您返回的單元格可能會使用微調器或其他數據未完成的指示。當請求完成時,您可以告訴表重新加載相應的行,以便顯示正確的內容。

+0

儘管這個第一個答案直接影響了我的問題,但您的啓發讓我有了一個我稍後會用到的想法。這個想法是加載我需要的整個行集,但只是要求顯示的數據,比方說第一個50,然後請求下一個需求,等等。就像你解釋的那樣。謝謝Caleb! –

2

@Pratik Patel Bellow答案是最好的。 在網絡服務響應中右下或調用波紋管函數。

func updateWithScroll(data: [String]) { 
    guard let tableView = tableView else { 
     return 
    } 
    guard let currentVisibleIndexPaths = tableView.indexPathsForVisibleRows else { 
     return 
    } 
    var updatedVisibleIndexPaths = [IndexPath]() 
    for indexPath in currentVisibleIndexPaths { 
     let newIndexPath = IndexPath(row: indexPath.row + data.count, section: indexPath.section) 
     updatedVisibleIndexPaths.append(newIndexPath) 
    } 
    tableView.reloadData() 
    tableView.scrollToRow(at: updatedVisibleIndexPaths[0], at: .top, animated: false) 
} 
相關問題