簡答
- 提供足夠的喘息空間來
estimatedRowHeight
- 更改一旦被
dequeueReusableCellWithIdentifier
返回UITableViewCell
將不使用緩存的細胞
- 觸發工作單元重新加載
reloadRowsAtIndexPaths
- 使用Core Data管理您的緩存並讓
NSFetchedResultsController
樣板代碼可以做所有的UI工作。
在下文中詳細
代碼不會滾動:
- 如果電池被刷新等於或低於地平線,該
UITableView
不會滾動
- 如果正在刷新的單元格位於頂部之上,
UITableView
將不會滾動
UITableView
只能在單元看得見時纔會滾動,並且需要比可用空間更多的空間。
讓UITableViewAutomaticDimension
做的辛勤工作
你需要告訴可可觸摸小區是陳舊,這樣就會引發新dequeueReusableCellWithIdentifier
,到你要回一個單元與適當的高度。
無法重新加載整個表視圖或其中一個節,並且假設索引穩定,請調用-tableView:reloadRows:at:with:
傳遞剛剛更改的單元格的indexPath和.fade
動畫。
代碼:
override func viewDidLoad() {
super.viewDidLoad()
tableView.estimatedRowHeight = 250 // match your tallest cell
tableView.rowHeight = UITableViewAutomaticDimension
}
使用URLSession
。當圖像變爲可用,火reloadRows:at:with
:
func loadImage(_ url: URL, indexPath: IndexPath) {
let downloadTask:URLSessionDownloadTask = URLSession.shared.downloadTask(with: url, completionHandler: {
(location: URL?, response: URLResponse?, error: Error?) -> Void in
if let location = location {
if let data:Data = try? Data(contentsOf: location) {
if let image:UIImage = UIImage(data: data) {
self.cachedImages![indexPath.row] = image
self.cachedUrls![indexPath.row] = url
DispatchQueue.main.async(execute: {() -> Void in
self.tableView.beginUpdates()
self.tableView.reloadRows(
at: [indexPath],
with: .fade)
self.tableView.endUpdates()
})
}
}
}
})
downloadTask.resume()
}
示例:*維基百科獲取隨機的一組圖片*
►查找GitHub和額外的這個解決方案有關Swift Recipes的詳細信息。
'beginUpdates'和'endUpdates'在這種情況下實際上是無效的*你不應該在組中調用reloadData *說明文檔。 – vadian
試過'reloadData'? –
@HarikrishnanT:是的。給糟糕的UI體驗。 – Nitish