gpt4 book ai didi

ios - UIImage 在滚动之前不会显示在 TableView 单元格中

转载 作者:行者123 更新时间:2023-11-30 12:45:51 26 4
gpt4 key购买 nike

问题:请参阅 video 。我正在从 Firebase 存储下载图像并显示在表格 View 单元格上。构建应用程序后,图像不会显示在表格 View 的第一个单元格中。向下和向后滚动后,我可以在表格 View 的第一个单元格中看到图像。

我查阅了这个question (清除应用程序数据和模拟器缓存不起作用)和这个question (不同的问题是他们从网址下载图像)。我读过this关于使用占位符图像,但我不确定它是否适用,因为我没有使用 SDWebImage 并且我的单元格使用我自己的 companyImage UIImageView 而不是 UITableView 单元附带的 imageView

代码:

公司 View Controller :

class CompanyViewController: UIViewController, UISearchBarDelegate, UIScrollViewDelegate, UITableViewDelegate, UITableViewDataSource {

override func viewDidLoad() {
super.viewDidLoad()
companyTableView.register(CompanyTableViewCell.self, forCellReuseIdentifier: "CompanyTableViewCell")
companyTableView.register(UINib(nibName: "CompanyTableViewCell", bundle: nil), forCellReuseIdentifier: "CompanyTableViewCell")
loadData()
}

func loadData() {
        databaseHandle = databaseRef?.child("companies").observe(.value, with: { (snapshot) in
            for item in snapshot.children.allObjects as! [FIRDataSnapshot] {
                let company = Company()
                let id = item.childSnapshot(forPath: Property.id.rawValue).value as! String
                let imageName = id + ".png"
                let imageRef = self.storageRef?.child(imageName)
                imageRef?.data(withMaxSize: 1 * 1024 * 1024) { data, error in
                    if let error = error {
                        print((error as Error).localizedDescription)
                    } else if let data = data {
                        // Data for "images/companyid.png" is returned
                        company.image = UIImage(data: data)
                    }
                }
                self.informationStateController?.addCompany(company: company)
            }
            DispatchQueue.main.async {
                self.companyTableView.reloadData()
            }
        })
    }

 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
    {
        let company = (self.informationStateController?.companies[indexPath.row])!
        let customCell = tableView.dequeueReusableCell(withIdentifier: CompanyTableViewCell.identifier) as! CompanyTableViewCell
customCell.companyImage.image = company.image
        return customCell
    }
}

公司表格 View 单元

class CompanyTableViewCell: UITableViewCell {
    
    @IBOutlet weak var companyImage: UIImageView!
 
override func awakeFromNib() {
        super.awakeFromNib()
        companyImage.contentMode = .scaleAspectFit
}
}

最佳答案

我终于找到了一个相当不错的解决方案来解决加载图像问题(但不是内存问题)。我用过这个question

之前,我在下载图像之前返回了公司对象。相反,在我更新的方法中,我将图像分配给主队列上的公司对象,因为那时我知道公司对象有图像,所以我还重新加载 TableView 。

注意: 该解决方案并不完美,因为我确实注意到,当我第一次打开此 View Controller 时,需要等待一段时间才能加载所有图像,但这是我见过的最佳解决方案目前已找到。

更新代码

func loadData() {
databaseHandle = databaseRef?.child("companies").observe(.value, with: { (snapshot) in
for item in snapshot.children.allObjects as! [FIRDataSnapshot] {
let company = Company()
let id = item.childSnapshot(forPath: Property.id.rawValue).value as! String
let imageName = id + ".png"
let imageRef = self.storageRef?.child(imageName)
imageRef?.data(withMaxSize: 1 * 1024 * 1024) { data, error in
if let error = error {
print((error as Error).localizedDescription)
} else if let data = data {
DispatchQueue.main.async { //UPDATED PART OF CODE STARTS HERE
company.image = UIImage(data: data)
self.companyTableView.reloadData()
} //UPDATED PART OF CODE ENDS HERE

}
}
self.informationStateController?.addCompany(company: company)
}
})
}

关于ios - UIImage 在滚动之前不会显示在 TableView 单元格中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41654308/

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