2017-01-09 28 views
0

イメージURLがあり、そのイメージをtableViewセルに配置されたUIImageViewに表示したいとします。 私はカスタムセルを作成し、imageViewのコンセントを追加しました。 私はニュースをロードしているので、それに従ってURLが変わります。 注:私はAlamofireを使用してHTTPリクエストを処理しています。URLからイメージをロードしてtableViewセルに表示する方法(Swift 3)

struct News { 
    let title: String 
    let text: String 
    let link: String 
    let imgUrl: String 

    init(dictionary: [String:String]) { 
     self.title = dictionary["title"] ?? "" 
     self.text = dictionary["text"] ?? "" 
     self.link = dictionary["link"] ?? "" 
     self.imgUrl = dictionary["imgUrl"] ?? "" 
    } 
} 

そして、私のカスタムセルに情報をロードする

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as? newsCellTableViewCell 
    let news = newsData[indexPath.row] 
    cell?.headline.text = news.title 
    cell?.excerpt.text = news.text 
    cell?.thumbnailImage.text = news.imgUrl 
    return cell! 
} 
+1

可能重複http://stackoverflow.com/questions/24231680/loading-downloading-image-from-url-on-swift/27712427#27712427 –

+0

@LeoDabusは良いポストを示唆しました。しかし、すでにAlamofireを使用しているので、最も簡単な方法はhttps://github.com/Alamofire/AlamofireImageライブラリをインストールし、以下の構文を使用してイメージを表示することです。これは、非同期ロードとすべてを処理します。 'セル?.thumbnailImage.af_setImage(withURL:<実際のサムネイル_URL>)' –

答えて

1

あなたがAlamofireを使用しているので、これは、非常に容易になります。 @ Mochiの例とは異なり、これはインターフェースをブロックしません。

はここに例を示します

Alamofire.request(news.imgUrl).response { response in 
    if let data = response.data { 
     let image = UIImage(data: data) 
     cell?.thumbnailImage.image = image 
    } else { 
     print("Data is nil. I don't know what to do :(") 
    } 
} 

*私は答えの前にこれをテストすることができませんでしたのでご注意ください。このコードを少し微調整する必要があるかもしれません。

0

SDWebImageをご利用ください。 UIをフリーズすることなく、画像をバックグラウンドでダウンロードする画像ビューカテゴリです。また、キャッシングも提供します。プレースホルダ画像も設定できます。プレースホルダは、実際の画像がダウンロードされるまで表示されます。ダウンロード後、セルのImageview内の実際のイメージは自動的に更新され、完了ハンドラを使用する必要はありません。

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as? newsCellTableViewCell 
    let news = newsData[indexPath.row] 
    cell?.headline.text = news.title 
    cell?.excerpt.text = news.text 
    cell?.thumbnailImage.sd_setImageWithURL(NSURL(string: news.imgUrl), placeholderImage:UIImage(imageNamed:"placeholder.png")) 
    return cell! 
} 
+0

エラーが発生しました: 'UIImageView'タイプの値にメンバがありません 'sd_setImageWithURL' –

+0

プロジェクトにsdwebImageライブラリを追加してくださいhttps://github.com/ rs/SDWebImage –

+0

私はすでに私の答えにリンクを追加しています –

0

は、URLから画像を取得するには、このコードを使用することができますし、同様にプレースホルダ画像を設定することができます。例えば: -

cell.imageView?.imageFromURL(urlString: "urlString", PlaceHolderImage: UIImage.init(named: "imagename")!) 

extension UIImageView { 

public func imageFromServerURL(urlString: String, PlaceHolderImage:UIImage) { 

     if self.image == nil{ 
       self.image = PlaceHolderImage 
     } 

     URLSession.shared.dataTask(with: NSURL(string: urlString)! as URL, completionHandler: { (data, response, error) -> Void in 

      if error != nil { 
       print(error ?? "No Error") 
       return 
      } 
      DispatchQueue.main.async(execute: {() -> Void in 
       let image = UIImage(data: data!) 
       self.image = image 
      }) 

     }).resume() 
    }} 
関連する問題