我正在尝试从后端人员提供的api中获取图像并下载图像,我正在通过pods使用“ SDWebImage
”。我的要求是:我将拥有以下产品的集合:该收集数据我具有图像url。我必须从该图像url获取该产品图像,并且我需要在单独的产品详细信息中显示该图像Viewcontroller
,但是我遇到了类似“线程1:致命错误”的运行时错误:意外地发现了nil,同时展开了Optional值”。我在下面提供了我的代码
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
var imag: String = dict["photo"] as! String
lmpviewcontroller.userimgobj.sd_setImage(with: URL(string:imag), placeholderImage: UIImage(named: "Avatar-male.png"))
}
答案 0 :(得分:1)
这将有助于查看崩溃行,但是在您发布的代码中已经显示出了可能,其中您从JSON中强制解包了字符串值:
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
var imag: String = dict["photo"] as! String
lmpviewcontroller.userimgobj.sd_setImage(with: URL(string:imag), placeholderImage: UIImage(named: "Avatar-male.png"))
}
使用!
进行强制展开。
这应该类似于:
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
guard let imageURL: String = dict["photo"] as? String else { return }
lmpviewcontroller.userimgobj.sd_setImage(with: URL(string: imageURL), placeholderImage: UIImage(named: "Avatar-male.png"))
}
通过强制展开,这意味着您100%确保该值将始终存在。如果没有id,则您的应用程序将崩溃。
通过可选地检查它,您需要使用if let
或guard let
检查它的存在。一般来说,这类似于:
let myOptionalValue: Any?
if myOptionalValue == nil {
return
} else {
doSomethingWithMyValue(myOptionalValue!)
}
,但是Swift的语法更好,如先前所示。
答案 1 :(得分:0)
我建议使用Kingfisher
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
if let imag = dict["photo"]{
let url = URL(string: imag)
userimgobj.kf.setImage(with: url)
}
}
答案 2 :(得分:0)
//带有sd图像
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
if dict["photo"] != nil{
lmpviewcontroller.userimgobj.sd_setImage(with: URL(string:imag)), completed: nil)
}else{
lmpviewcontroller.userimgobj = UIImage(named: "placeholder")
}
}