2016-11-07 3 views
2

tableViewからUIViewControllerUIImageViewを渡すことができません。別のビューに画像を渡すことができません(非同期を取得した後)

func loadImageFromUrl(url: String, view: UIImageView){ 

     // Create Url from string 
     let url = NSURL(string: url)! 

     // Download task: 
     // - sharedSession = global NSURLCache, NSHTTPCookieStorage and NSURLCredentialStorage objects. 
     let task = URLSession.shared.dataTask(with: url as URL) { (responseData, responseUrl, error) -> Void in 
      // if responseData is not null... 
      if let data = responseData{ 

       // execute in UI thread 
       DispatchQueue.main.async { 
        view.image = UIImage(data: data) 
       } 
      } 
     } 

     // Run task 
     task.resume() 
} 

そして、それは私が私のtableViewを移入方法は次のとおりです:画像をダウンロードする方法がある画像は、テーブルビューに表示されているが、私は、他のビューに渡すしようとすると、それはnil

を取得します

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    let cell = Bundle.main.loadNibNamed("UIProductTableViewCell", owner: self, options: nil)?.first as! UIProductTableViewCell 
    cell.selectionStyle = .none 

    //Populating data 
    cell.descriptionLabel.text = catalogOfProducts[indexPath.row].name 
    cell.priceLabel.text = catalogOfProducts[indexPath.row].regularPrice 

    if (catalogOfProducts[indexPath.row].productImageURL == "") { 
     cell.productImageView.image = UIImage(named: "noImage") 
    }else{ 
     loadImageFromUrl(url: catalogOfProducts[indexPath.row].productImageURL!, view: cell.productImageView) 

    } 
    catalogOfProducts[indexPath.row].productImage = cell.productImageView.image 
    return cell 
} 

catalogOfProducts[indexPath.row] iはそれぞれのオブジェクトにUIImageを渡す方法です。

は私がちょうど Productオブジェクトを渡し、セグエを介してデータを渡すには:単にダウンロードした画像を管理

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 
    performSegue(withIdentifier: "productDetailSegue", sender: catalogOfProducts[indexPath.row]) 
} 

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
     let productDetailViewController = segue.destination as! ProductDetailViewController 
     productDetailViewController.featuredProduct = (sender as? Product)! 
} 
+0

SDWebImageのようなものを使用することをお勧めします。それはキャッシングを提供するので、2番目のビューコントローラでイメージをもう一度ダウンロードすることができます。すでにダウンロードされている場合は、キャッシュから取得されます。 – Paulw11

+0

最初に、すべてのイメージを配列に格納し、ダウンロードしたパスを使用します。 – CodeChanger

+0

コメントありがとうございます!実際、画像は 'Product'のプロパティに格納されています。配列はちょうど 'Product'タイプ –

答えて

2

のためには、SDWebImageライブラリを使用することができます。 SDWebImageの

リンク:https://github.com/rs/SDWebImage

このライブラリうまくパスで画像を管理します。ちょうど次のビューに自分の画像URLを渡し、agin次のビューで画像を取得するために同じコードを使用しながら、

cell.productImageView.sd_setImageWithURL(NSURL(string: catalogOfProducts[indexPath.row].productImageURL!), placeholderImage:UIImage(imageNamed:"placeholder.png")) 

:SDWebImageの使い方

注:上記の関数aginを呼び出している間は、画像aginをダウンロードしてダウンロードした画像を返しません。

希望すると、これが役立ちます。

+0

私はそれをチェックアウトします。ありがとう。 –

+0

それは働いた...ありがとう!私はこれが毎回heheをダウンロードしないことを願っています –

+0

素晴らしい!はい、それはaginをダウンロードしません。 – CodeChanger

0

あなたは、私は私のアプリの中でこの問題に対処する方法をiOSの、で意見を渡しすることはできませんだけで、画像の名前を渡し、これについて新しいViewControllerを

+0

画像を保存して名前だけを渡す方法はどうですか? –

+0

私のアプリでは申し訳ありませんが、私はいつもイメージ名にアクセスできますが、それがなければイメージデータを渡す必要があります。残念なことに私は素早くそれに精通していないが、ここでUIImageを変換する方法です - > NSDataとNSData - > UIImageここではObjective-Cの例ですhttp://stackoverflow.com/questions/20013144/convert-uiimage-to- nsdata-and-back-to-uiimage – yawnobleix

1

でそれを再ロードされる -

オーバライドfuncを準備する(セグ:UIStoryboardSegue、送信者:任意?){ productDetailViewController = segue.destinationを! ProductDetailViewController productDetailViewController.featuredProduct =(送信者は?Product)! }

あなたの送信者はここ​​にチェックされていますか?イメージ名を送信するだけで、次のView Controllerにアクセスできます。

関連する問題