2017-12-27 190 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