[英]UIImage not showing in table view cell until scroll
問題:觀看視頻 。 我正在從Firebase存儲下載圖像,並在表格視圖單元中顯示。 構建應用程序后,圖像不會顯示在表格視圖的前幾個單元格中。 上下滾動后,我可以在表格視圖的第一個單元格中看到圖像。
我咨詢了這個問題 (清除應用程序數據和模擬器的緩存不起作用)和這個問題 (不同的問題b / c,他們正在從網址下載圖片)。 我看了這個關於使用占位符圖像,但我不知道這是否是因為我沒有使用SDWebImage是適用的,我的手機采用了我自己companyImage
UIImageView
,而不是imageView
附帶UITableView
細胞。
碼:
公司視圖控制器:
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
}
}
公司表格視圖單元格
class CompanyTableViewCell: UITableViewCell {
@IBOutlet weak var companyImage: UIImageView!
override func awakeFromNib() {
super.awakeFromNib()
companyImage.contentMode = .scaleAspectFit
}
}
我終於找到了一個很好的解決加載映像問題(但不是內存問題)的方法。 我用了這個問題 。
以前,在下載圖像之前,我要返回公司對象。 取而代之的是,在更新的方法中,我將圖像分配給主隊列上的公司對象,由於那時候我知道公司對象具有圖像,所以我也重新加載了表格視圖。
注意:該解決方案並不是完美的,因為我確實注意到,當我第一次打開此視圖控制器時,需要等待一段時間才能全部加載圖像,但這是到目前為止找到的最好的解決方案。
更新的代碼
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)
}
})
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.