图像未显示在 UICollectionViewCell 中
Images not showing in UICollectionViewCell’s
我正在使用 UIKIT 和 Swift 制作一个 iOS 电影应用程序,我想在集合视图中显示电影,但是有一些小故障,并且有一些 traingle 正在播放的电影。
有人可以帮忙吗?谢谢
moviesViewController.swift
//
// FirstViewController.swift
// PopcornTime
//
// Created by Maxime Ruys on 15/03/2020.
// Copyright © 2020 Pixel-Developers. All rights reserved.
//
import UIKit
import SwiftyJSON
class MoviesViewController: UIViewController, UICollectionViewDataSource, UICollectionViewDelegate {
@IBOutlet weak var moviesCollectionView: UICollectionView!
var movies = [Movie]()
override func viewDidLoad() {
super.viewDidLoad()
self.moviesCollectionView.delegate = self
self.moviesCollectionView.dataSource = self
fetchMovies()
}
func fetchMovies(){
self.movies = []
let url = URL(string: "API_URL_HERE")
guard let requestUrl = url else { fatalError() }
var request = URLRequest(url: requestUrl)
request.httpMethod = "GET"
request.httpBody = "".data(using: String.Encoding.utf8)
let task = URLSession.shared.dataTask(with: request) { (data, response, error) in
if (error != nil) {
print(error)
} else {
if let data = data, let dataString = String(data: data, encoding: .utf8) {
do {
if let dataFromString = dataString.data(using: .utf8, allowLossyConversion: false) {
let json = try JSON(data: dataFromString)
for(_, movie) in json{
var imgs = [String]()
imgs.append(movie["images"]["banner"].stringValue)
imgs.append(movie["images"]["poster"].stringValue)
imgs.append(movie["images"]["fanart"].stringValue)
self.movies.append(Movie(id: movie["_id"].stringValue, title: movie["title"].stringValue, desc: movie["synopsis"].stringValue, playTime: movie["runtime"].stringValue, imgs: imgs))
}
}
} catch {
print(error)
}
DispatchQueue.main.async {
self.moviesCollectionView.reloadData()
}
}
}
}
task.resume()
}
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return self.movies.count
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "MoviesRowController",
for: indexPath) as! MoviesRowController
cell.moviesRowImg.image = downloadImage(from: URL(string: movies[indexPath.row].imgs[0])!)
cell.moviesTitleLbl.text = movies[indexPath.row].title
return cell
}
func downloadImage(from url: URL) -> UIImage{
getData(from: url) { data, response, error in
guard let data = data, error == nil else { return }
DispatchQueue.main.async() {
return UIImage(data: data)
}
}
return UIImage(named: "test")!
}
func getData(from url: URL, completion: @escaping (Data?, URLResponse?, Error?) -> ()) {
URLSession.shared.dataTask(with: url, completionHandler: completion).resume()
}
}
collectionview 故障图像:
集合视图属性:
collectionview 单元格属性:
You can do introspection like below.
if movies[indexPath.row].imgs.count>0, let url = URL(string: movies[indexPath.row].imgs[0]!) {
}
If you wish to Cache the images to avoid multiple requests, use below extension.
let imageCache = NSCache<NSString, UIImage>()
extension UIImageView {
func imageFromServerURL(_ URLString: String, placeHolder: UIImage?) {
self.image = nil
if let cachedImage = imageCache.object(forKey: NSString(string: URLString)) {
self.image = cachedImage
return
}
if let url = URL(string: URLString) {
URLSession.shared.dataTask(with: url, completionHandler: { (data, response, error) in
//print("RESPONSE FROM API: \(response)")
if error != nil {
print("ERROR LOADING IMAGES FROM URL: \(error)")
DispatchQueue.main.async {
self.image = placeHolder
}
return
}
DispatchQueue.main.async {
if let data = data {
if let downloadedImage = UIImage(data: data) {
imageCache.setObject(downloadedImage, forKey: NSString(string: URLString))
self.image = downloadedImage
}
}
}
}).resume()
}
}}
你不能分配一个异步的值,所以 return 这里是 nil
func downloadImage(from url: URL) -> UIImage{
getData(from: url) { data, response, error in
guard let data = data, error == nil else { return }
DispatchQueue.main.async() {
return UIImage(data: data)
}
}
return UIImage(named: "test")
}
您的手机也未注册:
self.collectionView.register(UICollectionViewCell.self, forCellReuseIdentifier: "movieCell")
我正在使用 UIKIT 和 Swift 制作一个 iOS 电影应用程序,我想在集合视图中显示电影,但是有一些小故障,并且有一些 traingle 正在播放的电影。 有人可以帮忙吗?谢谢
moviesViewController.swift
//
// FirstViewController.swift
// PopcornTime
//
// Created by Maxime Ruys on 15/03/2020.
// Copyright © 2020 Pixel-Developers. All rights reserved.
//
import UIKit
import SwiftyJSON
class MoviesViewController: UIViewController, UICollectionViewDataSource, UICollectionViewDelegate {
@IBOutlet weak var moviesCollectionView: UICollectionView!
var movies = [Movie]()
override func viewDidLoad() {
super.viewDidLoad()
self.moviesCollectionView.delegate = self
self.moviesCollectionView.dataSource = self
fetchMovies()
}
func fetchMovies(){
self.movies = []
let url = URL(string: "API_URL_HERE")
guard let requestUrl = url else { fatalError() }
var request = URLRequest(url: requestUrl)
request.httpMethod = "GET"
request.httpBody = "".data(using: String.Encoding.utf8)
let task = URLSession.shared.dataTask(with: request) { (data, response, error) in
if (error != nil) {
print(error)
} else {
if let data = data, let dataString = String(data: data, encoding: .utf8) {
do {
if let dataFromString = dataString.data(using: .utf8, allowLossyConversion: false) {
let json = try JSON(data: dataFromString)
for(_, movie) in json{
var imgs = [String]()
imgs.append(movie["images"]["banner"].stringValue)
imgs.append(movie["images"]["poster"].stringValue)
imgs.append(movie["images"]["fanart"].stringValue)
self.movies.append(Movie(id: movie["_id"].stringValue, title: movie["title"].stringValue, desc: movie["synopsis"].stringValue, playTime: movie["runtime"].stringValue, imgs: imgs))
}
}
} catch {
print(error)
}
DispatchQueue.main.async {
self.moviesCollectionView.reloadData()
}
}
}
}
task.resume()
}
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return self.movies.count
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "MoviesRowController",
for: indexPath) as! MoviesRowController
cell.moviesRowImg.image = downloadImage(from: URL(string: movies[indexPath.row].imgs[0])!)
cell.moviesTitleLbl.text = movies[indexPath.row].title
return cell
}
func downloadImage(from url: URL) -> UIImage{
getData(from: url) { data, response, error in
guard let data = data, error == nil else { return }
DispatchQueue.main.async() {
return UIImage(data: data)
}
}
return UIImage(named: "test")!
}
func getData(from url: URL, completion: @escaping (Data?, URLResponse?, Error?) -> ()) {
URLSession.shared.dataTask(with: url, completionHandler: completion).resume()
}
}
collectionview 故障图像:
集合视图属性:
collectionview 单元格属性:
You can do introspection like below.
if movies[indexPath.row].imgs.count>0, let url = URL(string: movies[indexPath.row].imgs[0]!) {
}
If you wish to Cache the images to avoid multiple requests, use below extension.
let imageCache = NSCache<NSString, UIImage>()
extension UIImageView {
func imageFromServerURL(_ URLString: String, placeHolder: UIImage?) {
self.image = nil
if let cachedImage = imageCache.object(forKey: NSString(string: URLString)) {
self.image = cachedImage
return
}
if let url = URL(string: URLString) {
URLSession.shared.dataTask(with: url, completionHandler: { (data, response, error) in
//print("RESPONSE FROM API: \(response)")
if error != nil {
print("ERROR LOADING IMAGES FROM URL: \(error)")
DispatchQueue.main.async {
self.image = placeHolder
}
return
}
DispatchQueue.main.async {
if let data = data {
if let downloadedImage = UIImage(data: data) {
imageCache.setObject(downloadedImage, forKey: NSString(string: URLString))
self.image = downloadedImage
}
}
}
}).resume()
}
}}
你不能分配一个异步的值,所以 return 这里是 nil
func downloadImage(from url: URL) -> UIImage{
getData(from: url) { data, response, error in
guard let data = data, error == nil else { return }
DispatchQueue.main.async() {
return UIImage(data: data)
}
}
return UIImage(named: "test")
}
您的手机也未注册:
self.collectionView.register(UICollectionViewCell.self, forCellReuseIdentifier: "movieCell")