![](/img/trans.png)
[英]Falling into an infinite loop when trying to implement Infinite Scrolling using Swift
[英]Trying to implement infinite scroll in Swift UItableView using willDisplayCell. Want to control the increment to be done once
到目前為止,這是我嘗試過的:
override func collectionView(_ collectionView: UITableView, willDisplay cell: UICollectionViewCell, forRowAt indexPath: IndexPath) {
if (indexPath.row == self.dataArray.count-30) {
pageNumber += 1
self.downloadTask()
}
}
self.downloadTask()將使用pageNumber並下載適當的數據。
現在剩下30或更多行要顯示,頁碼正不斷增加很多次,我只想限制一次,直到self.downloadTask()完成執行,然后又回來,又剩下30行以顯示在UITableView中。
我該如何以這樣的方式進行操作:pageNumber僅每增加1一次,就剩下30行顯示在UITableView中。
我將數組計數檢查更改為3並能夠實現它。 更新后的代碼如下所示:
override func collectionView(_ collectionView: UITableView, willDisplay cell: UICollectionViewCell, forRowAt indexPath: IndexPath) {
if (indexPath.row == self.dataArray.count-3) {
pageNumber += 1
self.downloadTask()
}
}
我懷疑將30更改為3只會減少問題的發生率,而無法實際解決。 在頁面加載之間和/或當用戶快速滑動時,滾動也可能顯得不穩定或無響應。
我建議使用絕對(而不是相對)計算來確定何時需要下載新數據。
例如,如果您的downloadTask()函數一次獲取30個項目,則可以在顯示最后一個塊中的任何一項后,以30個項目塊處理dataArray並獲取下一個塊(頁面):
let wantPage = indexPath.row / 30 + 1
if wantPage > pageNumber
{
pageNumber = wantPage
downloadTask()
}
如果downloadTask()一次少於30個項目,並且您希望數據比集合視圖的滾動位置提前30個項目,則可以將該數字簡單地添加到塊(頁面)計算中:
let itemsPerPage = 10
let wantPage = (indexPath.row + 30) / itemsPerPage
if wantPage > pageNumber
{
pageNumber = wantPage
downloadTask()
}
您的pageNumber變量最終將到達沒有更多數據可用的點(即,少於每頁的項目),並且這種“絕對”計算將自動停止調用downloadTask()。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.