短い答え
- は、キャッシュされた細胞
- トリガAと一度
dequeueReusableCellWithIdentifier
によって返さUITableViewCell
ますない仕事を変えるestimatedRowHeight
- に十分な呼吸スペースを与えます単一セルの再ロード
reloadRowsAtIndexPaths
- コアデータでキャッシュを管理し、
NSFetchedResultsController
ボイラープレートコードはすべてのUI作業を行うことができます。詳細は
以下
コードはスクロールしません。リフレッシュされて、細胞がでたり地平線の下であればが
- 、
UITableView
が
- 場合をスクロールしません。リフレッシュされるセルが上にあり、
UITableView
はスクロールしません。
UITableView
は、セルが見やすいときにのみスクロールし、使用可能なスペースより多くのスペースを必要とします。
UITableViewAutomaticDimension
あなたはそれはあなたが返却しようとしている先の新しいdequeueReusableCellWithIdentifier
をトリガするように、セルが古いであることココアタッチを伝える必要がありますハードワーク
をやってみましょう適切な高さのセルセル。
テーブルビュー全体またはそのセクションの1つを再ロードすることが短く、インデックスが安定していると仮定すると、変更されたセルのindexPathと.fade
のアニメーションを渡すと-tableView:reloadRows:at:with:
が呼び出されます。
コード:
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