崩溃:当使用SDWebImage
更新的UIImageView
我想实现,当任何CollectionViewCell用户点击,然后一个新的视图将显示缩放和滚动。基本上我有两个不同的类,名为MyCollectionViewController和MyScrollViewController。我在我的收藏视图控制器下面的代码部分:崩溃:当使用SDWebImage
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath){ let storyboard = UIStoryboard(name: "Main", bundle: nil)
let VC = storyboard.instantiateViewController(withIdentifier: "myScrollVC") as? MyScrollViewController
self.navigationController?.pushViewController(VC!, animated: true)
VC?.setImageToScrollView(image_URL: (self.jsonData?.HD_WALLPAPER![indexPath.row].wallpaper_image)!)
}
而且我已经在我的滚动视图控制器下面的代码部分:我使用SDWebImage ...开源库
import UIKit import SDWebImage
class MyScrollViewController: UIViewController, UIScrollViewDelegate {
@IBOutlet weak var myImageView: UIImageView!
@IBOutlet weak var myScrollView: UIScrollView!
override func viewDidLoad(){
super.viewDidLoad()
self.myScrollView.minimumZoomScale = 1.0
self.myScrollView.maximumZoomScale = 6.0
}
public func setImageToScrollView(image_URL: String){
DispatchQueue.main.async {
self.myImageView!.sd_setImage(with: URL(string: image_URL), completed: {
(image, error, cacheType, url) in
//Completion Block ... Do Nothing
})
}
}
override func didReceiveMemoryWarning(){
super.didReceiveMemoryWarning()
}
func viewForZooming(in scrollView: UIScrollView) -> UIView?{
return self.myImageView
}
}
管理图像缓存。
问题:有时图像加载成功,没有任何错误,但大部分时间我的应用程序崩溃同时与下面的错误执行sd_setImage API的SDWebImage框架......
致命错误:意外发现零而展开的可选值
QUERY:
- 首先我叫pushViewController然后我打电话给我的自定义的功能。从集合视图单元调用函数是否正确?
- 为什么它显示意外地发现零,同时展开一个可选值..虽然我得到无错图像的网址。
回答:
再回到你的问题:
Firstly I called pushViewController and then I called my custom defined function. Is it proper way to call functions from collection view cell?
这个问题的答案是,你不应该调用引用网点,直到viewDidLoad中的功能。这些网点是隐含的解包选项,但不能保证直到viewDidLoad。所以,你有一个竞争条件。有时它有效。
更改它让你在一个URL传递,但不调用函数:
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath){ let storyboard = UIStoryboard(name: "Main", bundle: nil)
let VC = storyboard.instantiateViewController(withIdentifier: "myScrollVC") as? MyScrollViewController
self.navigationController?.pushViewController(VC!, animated: true)
VC.imgURL = self.jsonData?.HD_WALLPAPER![indexPath.row].wallpaper_image)!
}
凡imgUrl的是MyScrollViewContainer一个实例变量。然后从viewDidLoad调用你的函数,传入imgURL。
override func viewDidLoad(){ super.viewDidLoad()
self.myScrollView.minimumZoomScale = 1.0
self.myScrollView.maximumZoomScale = 6.0
setImageToScrollView(image_URL: imgURL)
}
这将改变您的通话时间 - 确保在调用该功能时确实存在插座。
===剩下的就是我先前的答案(仍然相关,但并没有解决你的问题)===
你不需要包装在Dispatch.async的SetImage电话。你的功能应该是一行:
public func setImageToScrollView(image_URL: String){ self.myImageView.sd_setImage(with: URL(string: image_URL))
}
这应该会让你的问题消失。如果插座仍然存在,SetImage会自行调度并更新UI。
其他评论者指出,为什么你的代码有时会崩溃(当你的异步块完成时self.myImageView可能为零)以及如何防范(如果让绑定或警卫来检查UIImageView插座是否仍然存在)。这些都是一般的相关技术 - 但SetImage会为您处理所有这些问题。
以上是 崩溃:当使用SDWebImage 的全部内容, 来源链接: utcz.com/qa/265419.html