簡體   English   中英

UIImage直到滾動才在表格視圖單元格中顯示

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM