質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

1回答

1833閲覧

JSONで取得したデータをコレクションビューに表示させたいがスクロールしないと表示されない

bws

総合スコア98

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2019/04/24 08:18

やりたいこと

添付画像の右側のように、Alamofireを使って取得したJSONデータをコレクションビューに表示したいです。

困っていること

起動すると添付画像の左側のようにセルの枠のみ表示されている状態になります。
しかし、画面をスクロールして戻すと思ったような表示になってしまいます。
起動時から右側のように表示させるにはどうしたら良いでしょうか?

コード

swift

1//CatalogViewController.swift 2 3import UIKit 4import Alamofire 5import SwiftyJSON 6 7class CatalogViewController: UIViewController, UICollectionViewDataSource, UICollectionViewDelegate, UICollectionViewDelegateFlowLayout { 8 9 @IBOutlet weak var displayToken: UILabel! 10 @IBOutlet weak var collectionView: UICollectionView! 11 12 @IBAction func logout(_ sender: UIButton) { 13 UserDefaults.standard.removeObject(forKey: "token") 14 performSegue(withIdentifier: "returnToLogin", sender: nil) 15 } 16 17 var products: JSON = [] 18 19 override func viewDidLoad() { 20 if let _ = UserDefaults.standard.object(forKey: "token") { 21 displayToken.text = UserDefaults.standard.object(forKey: "token") as? String 22 } 23 24 let layout = UICollectionViewFlowLayout() 25 layout.sectionInset = UIEdgeInsets(top: 15, left: 15, bottom: 15, right: 15) 26 collectionView.collectionViewLayout = layout 27 28 getProducts() 29 } 30 31 override func didReceiveMemoryWarning() { 32 super.didReceiveMemoryWarning() 33 } 34 35 func getProducts() { 36 37 let url = "http://xxx.com/api/products" 38 let token = UserDefaults.standard.object(forKey: "token") as? String 39 let authorization = "Bearer " + token! 40 let headers: HTTPHeaders = ["Authorization": authorization, "Accept": "application/json"] 41 42 Alamofire.request(url, method: .get, headers: headers).responseJSON { 43 res in 44 if res.result.isSuccess { 45 if let returnValue = res.result.value { 46 self.products = JSON(returnValue) 47 print("取得成功") 48 print(self.products) 49 } 50 } else { 51 print("取得に失敗しました") 52 } 53 } 54 } 55 56 func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { 57 58 // 識別子("Cell")によって特定された再利用可能なセルオブジェクトを取り出す 59 let cell: ProductCell = collectionView.dequeueReusableCell(withReuseIdentifier: "Product", for: indexPath) as! ProductCell 60 61 if self.products[indexPath.row]["thumbnail"].string != nil { 62 let imageUrlString: String = "http://www.com/data/thumbnail/" + self.products[indexPath.row]["thumbnail"].string! 63 64 cell.productImage.image = getImageByUrl(url: imageUrlString) 65 } 66 67 cell.productName.text = self.products[indexPath.row]["name"].string 68 cell.productNumber.text = self.products[indexPath.row]["number"].string 69 70 cell.backgroundColor = .red 71 72 return cell 73 } 74 75 func getImageByUrl(url: String) -> UIImage { 76 let url = URL(string: url) 77 do { 78 let data = try Data(contentsOf: url!) 79 return UIImage(data: data)! 80 } catch let err { 81 print("Error: (err.localizedDescription)") 82 } 83 return UIImage() 84 } 85 86 func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { 87 let horizontalSpace: CGFloat = 20 88 let cellSize: CGFloat = self.view.bounds.width / 3 - horizontalSpace 89 return CGSize(width: cellSize, height: cellSize * 1.618) 90 } 91 92 // セクションの数 93 func numberOfSections(in collectionView: UICollectionView) -> Int { 94 return 1 95 } 96 97 // セルの数 98 func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { 99 return 20 100 } 101}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

bws

2019/04/24 08:48

ありがとうございます、キャッシュ化はしていません。
guest

回答1

0

ベストアンサー

画面表示時には、まだ通信が完了していないのではないですか?
self.products = JSON(returnValue)
の後にcollectionViewの更新が必要と考えます。

投稿2019/04/24 08:37

dsuzuki

総合スコア1682

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

bws

2019/04/24 08:47

self.products = JSON(returnValue) の後に self.collectionView.reloadData() を記述したとろこ思い通りになりました。ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問