【问题标题】:Retrieving image from Firebase Storage placing in tableView not working,从 Firebase 存储中检索放置在 tableView 中的图像不起作用,
【发布时间】:2020-07-19 03:20:39
【问题描述】:

当我在 ViewController 中只有一个 imageView 时,我能够正确显示图像。我使用了这段代码:

        islandRef.getData(maxSize: 1 * 1024 * 1024) { [weak self] data, error in
          if let error = error {
            print((error.localizedDescription))
            // Uh-oh, an error occurred!
          }
            if let data = data{
                self?.imageItem.image = UIImage(data: data)
            }

        }
    }

我为我的 tableView 尝试了类似的方法,但它有点复杂。我有两个数组,它们从我的 firebase 文档中提取一个字符串和一个整数。我将这些附加到数组项目和价格中。我能够在我的 tableView 中显示这些值。当我的图片数组时,我尝试同样的事情。我可以将图像附加到它。然后我检查图片数组是否有计数。它的计数为 1,但是当我尝试在 tableview 中访问它时。它说错误:线程1:致命错误:索引超出范围。我不明白为什么我的其他数组有可用的值,但这个数组有。我不认为 imageView 有问题,因为我可以用我的 PlaceholderImage 替换图片[indexPath.row],它会正确显示我的占位符图像。

class ProfileViewController: UITableViewController {
    var item = [String]()
    var prices = [Int]()
    var pricePicture = [Any]()
    var db:Firestore!
    var pictures = [UIImage]()
    let storage = Storage.storage()
    var placeholderImage = UIImage(named: "placeholder.jpg")
    var imageMenu:UIImage?

    override func viewDidLoad() {
        getData()


        let db = Firestore.firestore()
        super.viewDidLoad()

    }
    func getData(){

        let db = Firestore.firestore()
        let docRef = db.collection("wine").document("pinot-noir-2017")
        let storage = Storage.storage()
               docRef.getDocument(source: .server) { (document, error) in

                if let document = document {
                    let keys = document.data()?.keys
                       for key in keys!{
                        self.item.append(key)
                        self.pricePicture = document.data()![key] as! [Any]
                        self.prices.append(self.pricePicture[0] as! Int)


                        let stor = storage.reference()
                        let islandRef = stor.child("carbanet.jpg")
                        islandRef.getData(maxSize: 1 * 1024 * 1024) { [weak self] data, error in
                          if let error = error {
                            print((error.localizedDescription))
                          }
                            if let data = data{

                                self?.pictures.append(UIImage(data: data)!)

                                //this will print 1
                                print(self?.pictures.count ?? 0)
                            }
                        }

                        self.tableView.reloadData()

                        }
                   } else {
                       //print("Document does not exist in cache")
               }
        }
    }




    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return item.count
    }
    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "Picture", for: indexPath)
        cell.textLabel?.text = item[indexPath.row] + "  $" + String(prices[indexPath.row])

        cell.imageView?.image = pictures[indexPath.row]

        return cell
    }

    override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        if let detailViewController = storyboard?.instantiateViewController(identifier: Constants.Storyboard.detailViewController) as? DetailViewController{
            show(detailViewController, sender: .none)
        }

    }
}

如果有人能告诉我我正在犯的错误,那就太好了。我对 swift 很陌生,所以你能给我的任何帮助将不胜感激。我已经阅读了 firebase 文档并观看了他们的视频,但我不明白为什么它在一种情况下有效,而在另一种情况下无效。

【问题讨论】:

    标签: ios swift firebase google-cloud-firestore firebase-storage


    【解决方案1】:

    我认为这是因为我试图在尝试访问 firebase 文档的过程中这样做。我创建了另一个函数 getImage(),这次成功了。

        func getImage(){
    
        let stor = storage.reference()
        let islandRef = stor.child("carbanet.jpg")
    
        islandRef.getData(maxSize: 1 * 1024 * 1024) { [weak self] data, error in
          if let error = error {
            print((error.localizedDescription))
            // Uh-oh, an error occurred!
          }
            if let data = data{
    
                self?.pictures.append(UIImage(data: data as Data)!)
    
                //this will print 1
                print(self?.pictures.count ?? 0)
            }
        }
            DispatchQueue.main.async {
                self.tableView.reloadData()
            }
        }
    

    【讨论】:

      猜你喜欢
      • 2017-01-14
      • 1970-01-01
      • 2020-10-23
      • 1970-01-01
      • 1970-01-01
      • 2018-06-05
      • 2021-03-26
      • 1970-01-01
      相关资源
      最近更新 更多