2017-01-14 37 views
0

問題:請參閱video。我正在從Firebase存儲中下載圖像並顯示在表格視圖單元格中。在我構建應用程序後,圖像不會顯示在表格視圖的第一個單元格中。在向下滾動和備份時,我可以在表格視圖的第一個單元格中看到圖像。UIImage在表格視圖單元格中未顯示,直到滾動爲止

我諮詢這個question(清除應用程序的數據緩存&模擬器沒有工作),這question(不同的問題B/C,他們正在下載的URL圖像)。我讀this關於使用佔位符圖像,但我不確定它是否適用,因爲我沒有使用SDWebImage,而我的單元使用我自己的companyImageUIImageView而不是UITableView單元附帶的imageView

代碼:

公司 - 視圖 - 控制器:

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 
    } 
} 
+0

歡迎回來。你至少嘗試過使用佔位符圖像嗎?如果該解決方案適用於「SDWebImage」,則應該在此處適用。我至少建議試着看看會發生什麼。 – Pierce

+0

您是否嘗試過調試'company.image'是否返回第一個屏幕加載的'tableView:cellForRowAt:'函數中的任何內容? –

+0

好吧,我只是這樣做的,對於第一次屏幕加載,所有七個單元格的圖像返回'nil',但是當我向下滾動和向上滾動時,我得到'可選(,{1998,496 })''''可選(,{646,218})'等 – 14wml

回答

0

我終於找到了一個相當不錯的解決方案,負載圖像問題(但不是內存問題)。我用這個question

之前,我在圖像被下載之前返回公司對象。相反,在我更新的方法中,我將圖像分配給主隊列上的公司對象,因爲那時我知道公司對象有圖像,我也重新加載了表視圖。

注:,因爲我注意到,有一個有點迫不及待地想,當我第一次打開該視圖控制器的所有加載的圖像,但它是到目前爲止,我已經找到了最好的解決方案的解決方案是不完美的。

更新的代碼

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) 
     } 
    }) 
} 
相關問題