初心者の為、もし文章に不手際があれば申し訳ございません。
前提・実現したいこと
UICollectionViewCell 内にある Label にJSONデータから取得した title のデータを表示させたいと考えています。
発生している問題・エラーメッセージ
URLを叩いて、JSONデータを取得できていることはprintログから確認出来ましたが、UIlabel への表示が出来ません。
Cell内にあるUILabelへのtag番号は付けております。StoruBoard 上の Cell の identifire 名の付け間違いも確認しましたが、cell と命名しています。
URLからJSONデータを取得するタイミングが誤っているのでしょうか?
ご教授いただけたら幸いです。
該当のソースコード
MainViewController
1import UIKit 2import Alamofire 3import SwiftyJSON 4 5class MainViewController: UIViewController, UICollectionViewDataSource, UICollectionViewDelegate, UICollectionViewDelegateFlowLayout { 6 7 @IBOutlet weak var collectionView: UICollectionView! 8 9 var articleList = [Article]() 10 11 override func viewDidLoad() { 12 super.viewDidLoad() 13 14 // Title Name 15 self.navigationItem.title = GlobalContent.MAIN_TITLE 16 17 // Font, and Title Setting 18 self.navigationController?.navigationBar.titleTextAttributes 19 = [NSAttributedString.Key.font: UIFont(name: "Helvetica", size: 25)!] 20 21 getJsonFromApi() 22 23 } 24 25 func getJsonFromApi(){ 26 27 // encode KeyWord 28 guard let encodedKeyWord = GlobalContent.KEY_WORD.addingPercentEncoding(withAllowedCharacters: .urlHostAllowed) else { 29 return 30 } 31 32 // make request URL 33 guard let requestURL = URL(string: "https://newsapi.org/v2/everything?q=(encodedKeyWord)&apiKey=(GlobalContent.API_KEY)") else { 34 return 35 } 36 37 print("request URL : (requestURL)") 38 39 Alamofire.request(requestURL, method: .get).validate().responseJSON { 40 response in 41 switch response.result { 42 case .success(let value): 43 let json = JSON(value) 44 json["articles"].forEach{(_, data) in 45 // check data with print 46 print("title (data["title"].string!)") 47 print("url (data["url"].string!)") 48 print("urlToImage (data["urlToImage"].string!)") 49 // add Article array 50 self.articleList.append(Article(title: data["title"].string!, url: data["url"].string!, imageToUrl: data["urlToImage"].string!)) 51 } 52 case .failure(let error): 53 print(error) 54 } 55 } 56 } 57 58 // data source 59 func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { 60 print("count == (self.articleList.count)") 61 return self.articleList.count 62 } 63 64 func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { 65 let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) 66 let cellLabel = cell.contentView.viewWithTag(1) as! UILabel 67 cellLabel.text = articleList[indexPath.row].title 68 return cell 69 } 70 71 override func didReceiveMemoryWarning() { 72 super.didReceiveMemoryWarning() 73 74 } 75 76} 77
使用している構造体は以下の通りです。
import Foundation struct Article: Codable { var title: String? var url: String? var imageToUrl: String? init(title: String, url: String, imageToUrl: String){ self.title = title self.url = url self.imageToUrl = imageToUrl } }
取得するJSONデータは以下の通りです。(一部抜粋)
[ "status": "ok", "totalResults": 1050, "articles": [ { "source": { "id": "engadget", "name": "Engadget" }, "author": "Kiyoshi Tane", "title": "アップルとFacebook、マンハッタン高級オフィス確保めぐり対立のうわさ", "description": "AMY OSBORNE via Getty Images\n\nアップルとFacebookが米ニューヨーク市マンハッタン地区の高級オフィススペースの確保をめぐり、互いに競り合っていることが報じられています。今のところFacebookが有利とのことです。New York Post報道によると、2つのIT巨人が取り合っている場所とは、マンハッタンのミッドタウンに位置し、ジェームズ・ファーレー郵便局の跡地にある74万平方フィート(約6万9000㎡)ものオフィススペース。Facebookが協議中ですが、アップルも今年はじめに…", "url": "https://japanese.engadget.com/2019/10/16/facebook/", "urlToImage": "https://o.aolcdn.com/images/dims?resize=2000%2C2000%2Cshrink&image_uri=https%3A%2F%2Fs.yimg.com%2Fos%2Fcreatr-uploaded-images%2F2019-10%2F92854c80-efd6-11e9-ad5d-71df488343d8&client=a1acac3e1b3290917d92&signature=23f510d7feb57e37322e2819ec9f3a10bb51204b", "publishedAt": "2019-10-16T06:20:00Z", "content": "New York Post2IT7469000Facebook\r\nFacebook4\r\nFacebook2Facebook\r\nVornado Realty TrustSteve RothFacebookFacebook\r\nFacebook\r\nITGAFAGoogle" }, { "source": { "id": "engadget", "name": "Engadget" }, "author": "Kiyoshi Tane", "title": "将来アップルリングが実現?指輪型デバイスの特許が承認", "description": "Apple/USPTO\n\nアップルが申請した指輪型デバイスの特許が、米特許商標庁(USPTO)に承認されたことが明らかとなりました。\n\n今年9月にアマゾンがAlexaが利用できる「Echo Loop」を発表し、2016年にはマイクロソフトがスマートリングの特許を申請していましたが、ウェアラブルの次の波は「指輪」に来るのかもしれません。特許の正式名称は「ウェアラブル電子リングコンピューティングデバイスの機器、メソッドおよびユーザーインターフェース」というもの。2015年に申請され、4年越しにUSPTOの認可を受けた…", "url": "https://japanese.engadget.com/2019/10/15/applering/", "urlToImage": "https://o.aolcdn.com/images/dims?resize=2000%2C2000%2Cshrink&image_uri=https%3A%2F%2Fs.yimg.com%2Fos%2Fcreatr-uploaded-images%2F2019-10%2F88c37f20-efc5-11e9-85fd-7b05b9ebf5f9&client=a1acac3e1b3290917d92&signature=648a4b4e23e46a757063c4cc88a9a423baae82d4", "publishedAt": "2019-10-16T03:53:00Z", "content": "20154USPTO\r\nSiriEcho LoopSiriSTB\r\nSiriEcho LoopPixel 4iPhone" },
補足情報(FW/ツールのバージョンなど)
Xcode 11
Swift 5
<ライブラリ>
AlamoFire
SwiftyJSON
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。