【问题标题】:UIImage not showing in table view cell until scrollUIImage 不显示在表格视图单元格中,直到滚动
【发布时间】:2017-05-29 23:42:59
【问题描述】:

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

我咨询了这个question(清除应用程序数据和模拟器缓存不起作用)和这个question(不同的问题b / c他们从url下载图像)。我阅读了this 关于使用占位符图像的信息,但我不确定它是否适用,因为我没有使用 SDWebImage 并且我的单元使用我自己的companyImage UIImageView 而不是@987654328 附带的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
     }
}

【问题讨论】:

  • 欢迎回来。您是否至少尝试过使用占位符图像?如果该解决方案适用于SDWebImage,它应该仍然适用于此处。我至少建议尝试一下看看会发生什么。
  • 您是否尝试过调试company.image 在第一个屏幕加载时是否在tableView:cellForRowAt: 函数中返回任何内容?
  • 哦,好吧,我只是这样做了,对于第一个屏幕加载,所有七个单元格的图像都返回 nil,但是当我向下滚动并向上滚动时,我得到 Optional(<UIImage: 0x6080002876c0>, {1998, 496}), @987654336 @等
  • 您是否尝试过您所链接的问题的答案所说的仅删除应用程序并重新安装它?
  • 顺便说一句,如果您从 .xib 文件加载单元格,请删除第一行 register companyTableView.register(CompanyTableViewCell.self, forCellReuseIdentifier: "CompanyTableViewCell")。你只需要第二个

标签: ios swift uitableview uiimage firebase-storage


【解决方案1】:

我终于找到了一个相当不错的加载图像问题(但不是内存问题)的解决方案。我用了这个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)
        }
    })
}

【讨论】:

  • 如果另一个人偶然发现了这个答案,如果你的问题不是一个简单的加载竞争条件,也可能是由于自动布局和你的约束以及显示系统计算你的视图不是在屏幕上可见。如果您知道您的问题不是由于竞争条件造成的,请尝试调整您的自动布局约束。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-11
  • 1970-01-01
相关资源
最近更新 更多