【问题标题】:Cannot insert downloaded image into array Firebase Swift无法将下载的图像插入数组 Firebase Swift
【发布时间】:2018-10-27 11:06:49
【问题描述】:

我正在使用 Firebase 和 Swift 4。

图像是从 Firebase 下载的,但我不知道如何将下载的图像插入到表格视图数组中。此代码将相同的图像返回到每个数组中。

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as? NewsTableViewCell

    let news: NewsList
    news = newsRows[indexPath.row]

    cell?.newsTitle.text = news.title
    cell?.newsDate.text = news.date

    let URL = self.newsImageReference
    print("abc")
    print(URL)
    let storage = Storage.storage()
    let storageRef = storage.reference(forURL: URL)

    storageRef.downloadURL(completion: { (url, error) in
        let data = try! Data(contentsOf: url!)
        let imageDownloaded = UIImage(data: data as Data)
        cell?.newsImg.image = imageDownloaded

        // should be 
        //cell?.newsImg = news.photo

    })

【问题讨论】:

    标签: arrays swift image firebase firebase-storage


    【解决方案1】:

    只需创建一个数组,例如 var customImages: [UIImage] = []

    然后添加customImages.append(UIImage(named: "image.png")!)

    let imageDownloaded = UIImage(data: data as Data)
    customImages.append(imageDownloaded)
    

    在 storageRef.downloadURL 关闭

    然后cell?.newsImg = customImages[indexPath.row],如果你有所有单元格的一张图片,你可以做 cell?.newsImg = customImages[0]

    【讨论】:

    • 感谢您的回复。它返回致命错误:索引超出范围。 storageRef.downloadURL(completion: { (url, error) in let data = try!Data(contentsOf: url!) var customImages: [UIImage] = [] customImages.append(UIImage(data: data as Data)!) 单元格? .newsImg.image = customImages[indexPath.row]
    • create var customImages: [UIImage] = [] 不在闭包内而是在函数外。例如: var customImages: [UIImage] = [] override func viewDidLoad() { super.viewDidLoad() ....} 并创建一个 func 将图像附加到数组中,然后在 cellForRowAt 中您可以检索它
    【解决方案2】:
    1. 首先为您的结构 NewsList 添加一个属性作为 imgUrl,例如 title、date
    2. 之后,当您获取其他 Firebase 数据时,请创建一个存储参考并为数据库中的每条记录获取您的 图片网址,并将这些网址设置为与您的每个 NewsList 实例
    3. 从数据库中获取数据后,只需调用 tableView.reloadData() 方法重新加载您的 tableview。
    4. 现在,您可以使用 SDWebImage,而不是每次都通过创建新的存储引用实例来下载每个图像,这对于从 远程下载图像更合适urls 因为它将下载的图像存储到 缓存 内存中,这样我们就不需要每次 tableview 单元重新加载时都下载图像。所以修改你的 cellForRowAt indexPath: 方法如下:

      func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
         let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as? NewsTableViewCell
         let news: NewsList
         news = newsRows[indexPath.row]
         cell?.newsTitle.text = news.title
         cell?.newsDate.text = news.date
         let imgURL = news.imgUrl
         cell?.newsImg.sd_setImage(with: imgURL) { (image, error, imgCacheType, url) in
              cell?.newsImg.image = image
         }
      }
      

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-02
      • 2018-05-28
      • 2018-03-16
      • 2016-03-16
      相关资源
      最近更新 更多