Повторное использование ячеек в UITableView
У меня есть пользовательская ячейка "NewsCell". Он содержит мой пользовательский вид 'ImageMosaicView' (это просто подкласс UIView). Я использую это, чтобы показать фотографии как в посте в Facebook. Я просто передаю URL-адреса изображений в экземпляр ImageMosaicView, и он загружает его и показывает.
У меня есть проблема. Когда я быстро прокручиваю свой tableView, тогда изображения из предыдущей ячейки на мгновение появляются в новой ячейке, пока загружаются новые изображения. Но я понятия не имею, как они там отображаются, потому что я предоставил изображения по умолчанию. Вот пример
Как я могу избежать этого?
// ImageMosaicView.swift
class ImageMosaicView: UIView {
@IBOutlet var imageViews: [UIImageView]!
var urlStrings: [String] = [] {
didSet {
for imageView in imageViews {
if let url = URL(string: urlStrings[i]) {
imageView.loadImage(url: url)
}
}
}
// MARK: - Initialization
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
let _ = loadViewFromNib()
}
// MARK: - Methods
func loadViewFromNib() -> UIView {
let bundle = Bundle.init(for: type(of: self))
let nib = UINib(nibName: "ImageMosaicView", bundle: bundle)
let view = nib.instantiate(withOwner: self, options: nil)[0] as! UIView
view.frame = bounds
view.autoresizingMask = [
UIViewAutoresizing.flexibleWidth,
UIViewAutoresizing.flexibleHeight
]
addSubview(view)
return view
}
}
// How I provide urls for images:
// NewsViewController.swift. 'tableView(cellForRow:, indexPath:)
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let news = newsCollection[indexPath.row]
let cell = tableView.dequeueReusableCell(withIdentifier: "NewsCell", for: indexPath) as! NewsCell
//...
cell.imageMosaicView.urlStrings = news.imageUrlsCollection
//...
return cell
} else {
return UITableViewCell()
}
}
1 ответ
Правильный способ сделать это - настроить prepareForReuse()
метод внутри класса NewsCell.
override func prepareForReuse() {
super.prepareForReuse()
imageView.image = //Default image
//Whatever other things you need cleared.
}
Этот метод вызывается всякий раз, когда tableView отключает ячейку. Таким образом, любые кэшированные данные должны быть очищены здесь, иначе они будут сохраняться в удаленной ячейке, если вы не измените их вручную перед возвратом в cellForRowAt
метод.