崩溃:当使用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:

  1. 首先我叫pushViewController然后我打电话给我的自定义的功能。从集合视图单元调用函数是否正确?
  2. 为什么它显示意外地发现零,同时展开一个可选值..虽然我得到无错图像的网址。

回答:

再回到你的问题:

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

回到顶部