gpt4 book ai didi

swift - UITableViewCell 子类单元格中的错误图像或旧图像错误

转载 作者:可可西里 更新时间:2023-11-01 00:56:22 25 4
gpt4 key购买 nike

伙计们,我曾经遇到过 Massive View Controller 问题,特别是在使用 UITableView 时,现在我正在将一个旧应用程序更改为更具模式性。以前,我曾经将整个单元格设置在 cellForRowAt indexPath 处。设置标签、下载图片等

现在我正在使用正确的方法在 UITableViewCell 子类中进行设置。但我遇到的问题是,在更新/下载新图片时重用保留旧图片的单元格,我想我已经解决了,但我也注意到它恰好有点把错误的图片放在错误的单元格中,然后在进行快速滚动时更新为正确的...

在我可以做这样的事情以确保图像在正确的单元格中更新之前。那就是像这样从 View Controller 设置整个单元格的时候......

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

let cell = tableView.dequeueReusableCell(withIdentifier: "Identifier")

cell.title = "Cool title"

imageLoader.obtainImageWithPath(imagePath: viewModel.image) { (image) in
// Before assigning the image, check whether the current cell is visible for ensuring that it's right cell
if let updateCell = tableView.cellForRow(at: indexPath) {
updateCell.imageView.image = image
}
}
return cell
}

现在我几乎只在 viewcontroller...

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

let cell : RestCell = self.tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! RestCell

// Pass data to Cell :) clean the mess at the View Controller ;)
cell.restData = items[indexPath.row]

return cell
}

还有 UITableViewCell 子类,我有这个。

class RestCell: UITableViewCell {

@IBOutlet var img : UIImageView!
@IBOutlet var lbl : UILabel!
@IBOutlet var lbl_tipocomida: UILabel!
@IBOutlet var lbl_provincia: UILabel!
@IBOutlet var img_orderonline: UIImageView!
@IBOutlet var img_open: UIImageView!
@IBOutlet var imgalldelivery: UIImageView!
@IBOutlet var img_reservasonline: UIImageView!

// get data and update.
var restData: RestsModel! {
didSet {
// default img early placeholder set. Eliminates showing old pic in cell reuse
self.img.image = UIImage(named: "60x60placeholder.png")
// Update all values func
updateUI()
}
}

override func awakeFromNib() {
super.awakeFromNib()
// Default image placeholder
//self.img.image = UIImage(named: "60x60placeholder.png")

}
// required init.
required init(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)!

// Color of selected.
let myCustomSelectionColorView = UIView()
myCustomSelectionColorView.backgroundColor = UIColor(red: 234.0/255.0, green: 46.0/255.0, blue: 73.0/255.0, alpha: 0.1) //UIColor(netHex:0xFFFF434)
selectedBackgroundView = myCustomSelectionColorView
}

fileprivate func updateUI() {

if (self.restData.image != nil && self.restData.image != "") {
ImageLoader.sharedLoader.imageForUrl(urlString:self.restData.image, completionHandler:{(image: UIImage?, url: String) in
self.img.contentMode = UIViewContentMode.scaleAspectFit
self.img.image = image
})
} else {
self.img.image = UIImage(named: "60x60placeholder.png")
}

self.lbl.text = restData.name as String
self.lbl_provincia.text = restData.provincia as String
self.lbl_tipocomida.text = restData.tipocomida as String

// check if has alldelivery enabled, show Alldelivery logo
if( self.restData.reservaonline == "1") {
self.img_reservasonline.isHidden = false
self.img_reservasonline.image = UIImage(named: "icon_reserva_on")

} else {
self.img_reservasonline.isHidden = true
self.img_reservasonline.image = UIImage(named: "icon_reserva_off")
}

// check if has orderonline, show ordeonline text
if ( self.restData.orderonline == "1") {
self.img_orderonline.isHidden = false
} else {

self.img_orderonline.isHidden = true
}

// check if has schedule, display if open or close

if (self.restData.hasSchedule == true) {

if ( self.restData.openNow == true) {
self.img_open.image = UIImage(named:"icon_open")
} else {
self.img_open.image = UIImage(named:"icon_close")
}

self.img_open.isHidden = false
} else {

self.img_open.isHidden = true
}

}

}

我正在从 UITableViewVCell 子类调用图像下载并将其设置在那里。如何确保图像仅设置为正确的单元格???

最佳答案

我建议您使用第 3 方库来加载带有 url 的图像,例如 Kingfisher。它将为您处理缓存和取消加载。

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let data = dataSource[indexPath.row]
let cell = tableView.dequeueReusableCell(withIdentifier: "Identifier") as! ACell
cell.update(data)
return cell
}

单元格看起来像这样。

import Kingfisher
class ACell: UITableViewCell {
@IBOutlet fileprivate weak var backgroundImageView: UIImageView!

fileprivate func reset() {
backgroundImageView.image = nil
}

func update(_ data: ATypeOfData) {
reset()
let resource = ImageResource(downloadURL: url)
backgroundImageView.kf.setImage(with: resource)
}
}

您失败的原因是您误解了重用单元格。

let updateCell = tableView.cellForRow(at: indexPath)

updateCell 可以是与您要使用的单元格不同的单元格。它可以只是一个重复使用的随机单元格。如果你真的想跟踪一个单元格,你需要设置一个属性并检查 cellForRowAt 中的属性是否与图像加载闭包中的属性相同。我真的建议你使用我附加的模式。

关于swift - UITableViewCell 子类单元格中的错误图像或旧图像错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46901059/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com