ios - 有时分配给 UITableViewCell 中的 UIImageView 的图像不正确

标签 ios swift uikit kingfisher

我有一个有几百人的群聊,当我快速滚动时,有时用户图像会从某处跳到另一处,或者向用户显示不正确的图像。

我已经关注了其他一些帖子,但我似乎仍然做错了一些事情。这里有什么突出的地方吗?我可以做些什么来解决这个问题?

谢谢!

final class MessageCell: UITableViewCell {

    private lazy var profileImageView: UIImageView = {
        let imageView = UIImageView()
        imageView.layer.cornerRadius = 20
        imageView.clipsToBounds = true

        return imageView
    }()

    // MARK: – Init

    override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
        super.init(style: style, reuseIdentifier: reuseIdentifier)

        selectionStyle = .none

        addSubview(profileImageView)

        setupConstraints()
    }

    private func setupConstraints() {
        constrain(profileImageView) {
            let size: CGFloat = 36
            $0.width == size
            $0.height == size
            $0.bottom == $0.superview!.bottom - CGFloat(3)
            $0.left == $0.superview!.left + CGFloat(12)
        }
    }


    func configure(with presentable: CellPresentable) {
        self.presentable = presentable

        if let sender = presentable.sender, presentable.isFirstMessage {
            profileImageView.setImage(url: (sender.object(forKey: "picture") as? PFFile)?.url, fallbackText: presentable.username)
        } else {
            PFUser.query()?.whereKey("objectId", equalTo: presentable.message.senderUserId).getFirstObjectInBackground { [weak self] user, error in
                self?.profileImageView.setImage(url: (user?.object(forKey: "picture") as? PFFile)?.url, fallbackText: presentable.username)
            }
        }
    }

    // MARK: Reuse -

    override func prepareForReuse() {
        super.prepareForReuse()

        profileImageView.kf.cancelDownloadTask()
        profileImageView.image = nil
    }

}

在我的 View Controller 中:

let cell = tableView.dequeueReusableCell(withIdentifier: "MessageCell") as! MessageCell
let presentable = CellPresentable(for: message, isFirstMessage: isFirstMessage, isLastMessage: isLastMessage)
cell.configure(with: presentable)

return cell

最佳答案

在 MessageCell 的配置函数中尝试以下代码

profileImageView.image = nil

新的函数代码:

func configure(with presentable: CellPresentable) {
    self.presentable = presentable
    profileImageView.image = nil
    if let sender = presentable.sender, presentable.isFirstMessage {
        profileImageView.setImage(url: (sender.object(forKey: "picture") as? PFFile)?.url, fallbackText: presentable.username)
    } else {
        PFUser.query()?.whereKey("objectId", equalTo: presentable.message.senderUserId).getFirstObjectInBackground { [weak self] user, error in
            self?.profileImageView.setImage(url: (user?.object(forKey: "picture") as? PFFile)?.url, fallbackText: presentable.username)
        }
    }
}

关于ios - 有时分配给 UITableViewCell 中的 UIImageView 的图像不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53746289/

相关文章:

javascript - 获取 JSON 数据时遇到问题

ios - 核心数据 NSPredicate for (select ... where not in (select))

ios - 适用于任何设备的带有SpriteKit的iOS 8游戏

ios - 无法在 Xcode 11 beta 中选择自定义字体?

arrays - 如何在 Swift 中将字符串数组转换为字符串

ios - 如何将粘性搜索栏添加到 UITableViewController

ios - CLGeocoder在iOS 5.1和6.0模拟器上返回不同的地标

ios - 容器 View 中的自定义 UITableViewController : NSInternalInconsistencyException

uikit - 在 WatchKit 中访问系统颜色

iphone - 边界中心