Swift 4 AlamofireImage с ячейкой UITableView - PullRequest
0 голосов
/ 21 мая 2018

Я использую AlamofireImages, чтобы попытаться загрузить изображение с сервера и отобразить его в своей ячейке табличного представления, это то, что я получил, но мои изображения не отображаются, только textLabel и detailTextLabel

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        let cell = tableView.dequeueReusableCell(withIdentifier: "trendingCell", for: indexPath)

        print(self.array[indexPath.row])

        cell.textLabel?.text = (self.array[indexPath.row]["title"] as! String)

        cell.detailTextLabel?.text = (self.array[indexPath.row]["username"] as! String)

        Alamofire.request("http://xxxxxxx.com/uploads/" + (self.array[indexPath.row]["cover"] as! String)).responseImage { response in
            if let image = response.result.value {
                cell.imageView?.image = image
            }
        }

        return cell
    }

Ответы [ 10 ]

0 голосов
/ 13 апреля 2019

Swift-5 Поддерживаемый код, который отлично работает

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    let cell = tblView.dequeueReusableCell(withIdentifier: "cell") as! TableViewCell
    cell.lblName.text = arrData[indexPath.row]["name"] as? String

  let imageUrl = arrData[indexPath.row]["imageUrl"] as? String

    Alamofire.request(imageUrl!, method: .get).response { response in
        guard let image = UIImage(data:response.data!) else {
            // Handle error
            return
        }
        let imageData = image.jpegData(compressionQuality: 1.0)
        cell.imgCourses.image = UIImage(data : imageData!)
    }

    return cell
} 
0 голосов
/ 31 мая 2018

Сначала вы должны проверить, правильно ли вы ответили, если получили ответ, а затем написать код типа

Alamofire.request(imageUrl!, method: .get).response { response in

                           if let image = UIImage(data: response.data!) {
                          cell. imageView?.image = image
                     }
      }
0 голосов
/ 01 июня 2018

Вы должны передать ссылку как переменную на переменную в ячейке и переопределить функцию awakefromnib в UITableViewCell.Внутри пера awakeFrom вы вызываете запрос alamofire для загрузки изображения в ячейку, таким образом вы не будете вызывать запрос каждый раз, когда он повторно использует ячейку.

, поэтому

// CellCode

import Alamofire
...

    var imageLink:String?

    override func awakeFromNib() {
            super.awakeFromNib()
    Alamofire.request(imageLink).responseImage { response in
                if let image = response.result.value {
                    self.imageView?.image = image
                }
            }
    }


//cell configuration
cell.imageLink = "http://xxxxxxx.com/uploads/" + self.array[indexPath.row]["cover"] as! String)
0 голосов
/ 28 мая 2018

Конечно, ваше изображение не будет отображаться для вас.Причина, когда Alamofire начинает загружать ваше изображение, обрабатывая его в фоновом потоке.Но вы работаете в основном потоке или потоке пользовательского интерфейса, поэтому вам нужно переключиться с фонового на основной поток, это будет работать для вас.

Alamofire.request("http://xxxxxxx.com/uploads/" + (self.array[indexPath.row]["cover"] as! String)).responseImage { response in
       DispatchQueue.main.async {
            if let image = response.result.value {
                cell.imageView?.image = image
            }
        }
}

Если вы считаете, что вам трудно это сделать, я рекомендую вам использовать эту библиотеку под названием Kingfisher, она будет обрабатывать асинхронную загрузку изображений для вас, которые обеспечивают бесперебойную работу таблицы вашей ячейки.

Ссылка: https://github.com/onevcat/Kingfisher

0 голосов
/ 29 мая 2018

Ваш код правильный.Я думаю, что транспортная безопасность заблокирует ваше изображение через http.добавьте это в ваш файл info.plist

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
    <key>NSExceptionDomains</key>
    <dict>
        <key>example.com</key>         //put your domain name here
        <dict>
            <key>NSExceptionAllowsInsecureHTTPLoads</key>
            <true/>
            <key>NSIncludesSubdomains</key>
            <true/>
        </dict>
    </dict>
</dict>

, и вы также можете использовать библиотеку изображений alamofire.просто добавьте стручок alamofireImage.

0 голосов
/ 22 мая 2018

Использование AlamofireImages

if let url = URL(string: "your url") {

    cell.imageView?.af_setImage(withURL:url, placeholderImage: nil, filter: nil,  imageTransition: .crossDissolve(0.2), runImageTransitionIfCached: false, completion: {response in
      // do stuff when is downloaded completely.
    })
}
0 голосов
/ 21 мая 2018

Вы можете использовать SDWebImage

Сначала вам нужно импортировать это

import SDWebImage

Затем вы можете использовать этот метод

let imgUrl = URL(string:"your image URL string")
cell.imageView?.sd_setImage(with: imgUrl, placeholderImage: UIImage(named: "propic"))
0 голосов
/ 21 мая 2018

Попробуйте:

 Alamofire.request(imageUrl!, method: .get).response { response in
                    guard let image = UIImage(data:response.data!) else {
                        // Handle error
                        return
                    }
                    let imageData = UIImageJPEGRepresentation(image,1.0)
                    cell.myImage.image = UIImage(data : imageData!)
                }

Это прекрасно работает для меня .. Надеюсь, это поможет.

0 голосов
/ 21 мая 2018

Вам нужно запустить этот код в главном потоке.

DispatchQueue.main.async {
    cell.imageView?.image = image
}
0 голосов
/ 21 мая 2018

Это помогло мне:

Сначала создайте эту функцию, чтобы помочь раскрыть изображение.Если вы вытягиваете несколько изображений, вы можете создать новый файл swift и сделать его статичным или просто вызвать его в том файле, который вам нужен.Таким образом, вы можете ссылаться на него вместо того, чтобы переписывать код:

static func loadImage(_ imageView: UIImageView,_ urlString: String) {
    let imgURL: URL = URL(string: urlString)!
    URLSession.shared.dataTask(with: imgURL) { (data, respond, error) in
        guard let data = data, error == nil else { return}

        DispatchQueue.main.async (execute: {
            imageView.image = UIImage(data: data)  
        })
    }.resume()
}

Затем вывести информацию:

if let logoName = variable.logo {
        StaticFileName.loadImage(cell.imgVariableInCell, "\(logoName)")
    }
    return cell
}

Тогда все готово.

...