現在、このような形でqiitaのAPIにアクセスしています。
取得したiconのurlからイメージを取得してcellに表示しようとしていますが、イメージ画像が表示されません。
cellをタップすると一時的に表示はされるのでイメージは取得できています。
iconのurlからイメージ取得後にtableViewがリロードできていないんだと思うのですが、どのタイミングでリロードすればいいのかわかりません。
またイメージを表示するために良い方法があればご教示いただければ助かります。
swift
1import UIKit 2 3struct Article: Codable { 4 var title: String 5 var user: User 6 struct User: Codable { 7 var id: String 8 var iconUrl: String 9 enum CodingKeys: String, CodingKey { 10 case id = "id" 11 case iconUrl = "profile_image_url" 12 } 13 } 14 var url: String 15 var tags: [Tag] 16 struct Tag: Codable { 17 var name: String 18 } 19} 20 21 22struct Qiita { 23 24 static func fetchArticle(completion: @escaping ([Article]) -> Swift.Void) { 25 26 let url = "https://qiita.com/api/v2/items" 27 28 guard var urlComponents = URLComponents(string: url) else { 29 return 30 } 31 32 urlComponents.queryItems = [ 33 URLQueryItem(name: "per_page", value: "50"), 34 ] 35 36 let task = URLSession.shared.dataTask(with: urlComponents.url!) { data, response, error in 37 38 guard let jsonData = data else { 39 return 40 } 41 42 do { 43 let articles = try JSONDecoder().decode([Article].self, from: jsonData) 44 completion(articles) 45 } catch { 46 print(error.localizedDescription) 47 } 48 } 49 task.resume() 50 } 51} 52 53class ViewController: UIViewController { 54 55 private var tableView = UITableView() 56 fileprivate var articles: [Article] = [] 57 58 override func viewDidLoad() { 59 super.viewDidLoad() 60 title = "最新記事" 61 62 setUpTableView: do { 63 tableView.frame = view.frame 64 tableView.dataSource = self 65 tableView.delegate = self 66 view.addSubview(tableView) 67 } 68 69 Qiita.fetchArticle(completion: { (articles) in 70 self.articles = articles 71 DispatchQueue.main.async { 72 self.tableView.reloadData() 73 } 74 }) 75 } 76} 77 78extension ViewController: UITableViewDataSource { 79 80 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 81 82 let cell = UITableViewCell(style: .subtitle, reuseIdentifier: "cell") 83 84 let article = articles[indexPath.row] 85 cell.textLabel?.text = article.title 86 cell.detailTextLabel?.text = article.user.id 87 cell.imageView?.downloadImage(from: article.user.iconUrl) 88 89 return cell 90 } 91 92 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 93 return articles.count 94 } 95} 96 97extension UIImageView { 98 99 func downloadImage(from url: String) { 100 101 let urlRequest = URLRequest(url: URL(string: url)!) 102 103 let task = URLSession.shared.dataTask(with: urlRequest) { (data,response,error) in 104 105 if error != nil { 106 print(error as Any) 107 return 108 } 109 110 DispatchQueue.main.async { 111 self.image = UIImage(data: data!) 112 } 113 } 114 task.resume() 115 } 116} 117 118extension ViewController: UITableViewDelegate { 119 120 func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 121 122 let article = articles[indexPath.row] 123 let articleURL = URL(string: article.url) 124 openWithSafari(url: articleURL) 125 } 126 127 func openWithSafari(url: URL?) { 128 guard let openUrl = url else { 129 print("無効なURLです") 130 return 131 } 132 133 if UIApplication.shared.canOpenURL(openUrl as URL) { 134 print(openUrl) 135 UIApplication.shared.open(openUrl) 136 } 137 } 138} 139
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/10/28 13:00
2018/10/28 13:08
2018/10/28 13:31