我想要实现的是,当用户点击任何CollectionViewCell时,将显示缩放和滚动的新视图。基本上我有两个不同的类,名为MyCollectionViewController和MyScrollViewController。我的集合视图控制器中有以下代码部分:
curl -I --silent ftp://username:passwd@192.168.1.63/filenotexist.txt >/dev/null
我在滚动视图控制器中有以下代码部分:
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 ...一个开源库来管理图片缓存。
问题:有时成功加载图片时没有任何错误,但大多数时候我的应用崩溃,同时执行的 sd_setImage api SDWebImage 框架有以下错误......
致命错误:在解包可选值时意外发现nil
QUERY :
答案 0 :(得分:0)
回到你的问题:
首先我调用了pushViewController,然后调用了自定义函数。是从集合视图单元调用函数的正确方法吗?
答案是你不应该在viewDidLoad之前调用引用outlet的函数。这些网点是隐式解包的选项,但在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可能是nil)以及如何防止(如果让绑定或保护检查UIImageView插座仍然存在)。这些都是相关的技术 - 但SetImage会为您处理所有这些。