为什么在 swift 中 json 的 collectionView 图像中获取 nil
Why getting nil in collectionView image from json in swift
我有带有图像和标签的集合视图...我能够显示从 json 到标签的文本值,并且我正在获取从 json 到 [=13= 的所有 img url ] 但是我无法在 collectionview 中显示所有这些图像。我在 cellForItemAtindexPath
中有所有 20 个图像 url 我可以在控制台中看到它,但为什么我无法在 collectionview 中显示它们。
这是我的代码:
import UIKit
import SDWebImage
struct JsonData {
var iconHome: String?
var typeName: String?
var id: String?
init(icon: String, tpe: String, id: String) {
self.iconHome = icon
self.typeName = tpe
self.id = id
}
}
class HomeViewController: UIViewController, UICollectionViewDelegate, UICollectionViewDataSource, UITextFieldDelegate, URLSessionDelegate {
@IBOutlet weak var collectionView: UICollectionView!
var itemsArray = [JsonData]()
override func viewDidLoad() {
super.viewDidLoad()
homeServiceCall()
}
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return itemsArray.count
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) as! HomeCollectionViewCell
let aData = itemsArray[indexPath.row]
cell.paymentLabel.text = aData.typeName
cell.paymentImage.sd_setImage(with: URL(string:aData.iconHome!)) { (_, error, _, _) in
if let error = error {
print(error)
}
}
print("tableview collection images \(String(describing: aData.iconHome))")
return cell
}
//MARK:- Service-call
func homeServiceCall(){
let urlStr = "https://********/webservices//getfinancer"
let url = URL(string: urlStr)
URLSession.shared.dataTask(with: url!, completionHandler: {(data, response, error) in
guard let respData = data else {
return
}
guard error == nil else {
print("error")
return
}
do{
let jsonObj = try JSONSerialization.jsonObject(with: respData, options: .allowFragments) as! [String: Any]
let financerArray = jsonObj["financer"] as! [[String: Any]]
for financer in financerArray {
guard let id = financer["id"] as? String else { break }
guard let pic = financer["icon"] as? String else { break }
guard let typeName = financer["tpe"] as? String else { break }
print("the json icons \(String(describing: pic))")
let jsonDataObj = JsonData(icon: pic, tpe: typeName, id: id)
self.itemsArray.append(jsonDataObj)
}
DispatchQueue.main.async {
self.collectionView.reloadData()
}
}
catch {
print("catch error")
}
}).resume()
}
}
当我在 cellForItemAtindexPath
中打印图像 url 时,我在控制台中获得了所有 20 个图像 url。但是为什么我无法在 collectionview 中显示它们。
我得到如下所示的输出.. 如果我在 sd_setImage
中提供占位符图像,那么有些图像正在显示,有些则没有显示,那么它会在 collectionview 中显示占位符图像,为什么?
这是我的输出:
有些图像即将出现,有些还没有但是服务器中没有空图像所有图像都在json..我被困在这里很长时间了..任何人都请在这里帮助我。
因为您正在使用 Swift 所以我建议您应该使用 KingFisher 而不是 SDWebImage 来处理来自 url 的图像。
我检查了你的代码,一切正常。但是,当您从 url 加载图像时,其中一些会抛出此错误:
A URL session error happened. The underlying error: Error Domain=NSURLErrorDomain Code=-1202 \"The certificate for this server is invalid. You might be connecting to a server that is pretending to be “anyemi.com” which could put your confidential information at risk."
此错误发生在域 anyemi.com
的 url 秒。
例如:
https://anyemi.com/PaySTAR/images/LSPUBLICSCHOOL_icon.png
https://anyemi.com/PaySTAR/images/CDMA_icon.png
域为 dev.anyemi.com
的网址效果很好。例如:
https://dev.anyemi.com/maheshbank/icons/electricity.png
https://dev.anyemi.com/maheshbank/icons/gas.png
因此问题出在您后端的 SSL 配置中。现在,您可以将域为 anyemi.com
的 url 更改为 dev.anyemi.com
进行测试,我相信它会很好地工作。
我有带有图像和标签的集合视图...我能够显示从 json 到标签的文本值,并且我正在获取从 json 到 [=13= 的所有 img url ] 但是我无法在 collectionview 中显示所有这些图像。我在 cellForItemAtindexPath
中有所有 20 个图像 url 我可以在控制台中看到它,但为什么我无法在 collectionview 中显示它们。
这是我的代码:
import UIKit
import SDWebImage
struct JsonData {
var iconHome: String?
var typeName: String?
var id: String?
init(icon: String, tpe: String, id: String) {
self.iconHome = icon
self.typeName = tpe
self.id = id
}
}
class HomeViewController: UIViewController, UICollectionViewDelegate, UICollectionViewDataSource, UITextFieldDelegate, URLSessionDelegate {
@IBOutlet weak var collectionView: UICollectionView!
var itemsArray = [JsonData]()
override func viewDidLoad() {
super.viewDidLoad()
homeServiceCall()
}
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return itemsArray.count
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) as! HomeCollectionViewCell
let aData = itemsArray[indexPath.row]
cell.paymentLabel.text = aData.typeName
cell.paymentImage.sd_setImage(with: URL(string:aData.iconHome!)) { (_, error, _, _) in
if let error = error {
print(error)
}
}
print("tableview collection images \(String(describing: aData.iconHome))")
return cell
}
//MARK:- Service-call
func homeServiceCall(){
let urlStr = "https://********/webservices//getfinancer"
let url = URL(string: urlStr)
URLSession.shared.dataTask(with: url!, completionHandler: {(data, response, error) in
guard let respData = data else {
return
}
guard error == nil else {
print("error")
return
}
do{
let jsonObj = try JSONSerialization.jsonObject(with: respData, options: .allowFragments) as! [String: Any]
let financerArray = jsonObj["financer"] as! [[String: Any]]
for financer in financerArray {
guard let id = financer["id"] as? String else { break }
guard let pic = financer["icon"] as? String else { break }
guard let typeName = financer["tpe"] as? String else { break }
print("the json icons \(String(describing: pic))")
let jsonDataObj = JsonData(icon: pic, tpe: typeName, id: id)
self.itemsArray.append(jsonDataObj)
}
DispatchQueue.main.async {
self.collectionView.reloadData()
}
}
catch {
print("catch error")
}
}).resume()
}
}
当我在 cellForItemAtindexPath
中打印图像 url 时,我在控制台中获得了所有 20 个图像 url。但是为什么我无法在 collectionview 中显示它们。
我得到如下所示的输出.. 如果我在 sd_setImage
中提供占位符图像,那么有些图像正在显示,有些则没有显示,那么它会在 collectionview 中显示占位符图像,为什么?
这是我的输出:
有些图像即将出现,有些还没有但是服务器中没有空图像所有图像都在json..我被困在这里很长时间了..任何人都请在这里帮助我。
因为您正在使用 Swift 所以我建议您应该使用 KingFisher 而不是 SDWebImage 来处理来自 url 的图像。
我检查了你的代码,一切正常。但是,当您从 url 加载图像时,其中一些会抛出此错误:
A URL session error happened. The underlying error: Error Domain=NSURLErrorDomain Code=-1202 \"The certificate for this server is invalid. You might be connecting to a server that is pretending to be “anyemi.com” which could put your confidential information at risk."
此错误发生在域 anyemi.com
的 url 秒。
例如:
https://anyemi.com/PaySTAR/images/LSPUBLICSCHOOL_icon.png
https://anyemi.com/PaySTAR/images/CDMA_icon.png
域为 dev.anyemi.com
的网址效果很好。例如:
https://dev.anyemi.com/maheshbank/icons/electricity.png
https://dev.anyemi.com/maheshbank/icons/gas.png
因此问题出在您后端的 SSL 配置中。现在,您可以将域为 anyemi.com
的 url 更改为 dev.anyemi.com
进行测试,我相信它会很好地工作。