2017-12-27 217 views
0
更新的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框架...... enter image description here

致命错误:意外发现零而展开的可选值

QUERY

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

似乎'self.myImageView'是'nil' –

+0

@RajibTheKing如果让绑定imageView而不是强制展开它,请做。你的imageView有时会因为你的应用程序崩溃而无法使用 –

回答

0

再回到你的问题:

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会为您处理所有这些问题。

+0

最初,我的功能和你写的完全一样。但它经常崩溃。添加DispatchQueue.main.async块后,崩溃率降低。但仍然没有解决..谢谢你的努力。 @ozzieozumo – RajibTheKing