Не удается вставить загруженное изображение в массив Firebase Swift - PullRequest
0 голосов
/ 17 мая 2018

Я использую 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

    })

Ответы [ 2 ]

0 голосов
/ 12 июня 2019
  1. Сначала добавьте еще одно свойство как imgUrl для вашей структуры Список новостей , например, заголовок, дата и т. Д.
  2. После этого, пока вы выбираете другие данные Firebase, укажите Ссылка на хранилище и получите URL-адреса изображений для каждой записи в вашей базе данных и установите эти URL-адреса, связанные с каждым вашим Экземпляр NewsList .
  3. После извлечения данных из базы данных просто перезагрузите представление таблицы, вызвав tableView.reloadData () метод.
  4. Теперь вместо того, чтобы каждый раз загружать каждое изображение путем создания нового эталонного хранилища, вы можете использовать SDWebImage , который является более подходящим решением для загрузки изображений из remote 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
       }
    }
    
0 голосов
/ 17 мая 2018

просто создайте массив, например 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], если у вас есть одно изображение для всей ячейки, которую вы можете сделать ячейкой? .NewsImg = customImages [0]

...