前提・実現したいこと
UICollectionVIewでAPIから取得したデータを表示する処理
###ソースコード
swift
1import UIKit 2import SwiftyJSON 3 4class ViewController: UIViewController{ 5 6 var viewWidth: CGFloat! 7 var viewHeight: CGFloat! 8 var cellWidth: CGFloat! 9 var cellHeight: CGFloat! 10 var cellOffset: CGFloat! 11 var navHeight: CGFloat! 12 var listDataCount: Int = 0 13 var jsonData = [(name: String, address: String, access: String, Image:String, Web: String, Mobile: Int)]() 14 15 @IBOutlet var storeCollectionView: UICollectionView! 16 17 override func viewDidLoad() { 18 super.viewDidLoad() 19 viewWidth = view.frame.width 20 viewHeight = view.frame.height 21 navHeight = self.navigationController?.navigationBar.frame.size.height 22 let nib = UINib(nibName: "CollectionViewCell", bundle: .main) 23 storeCollectionView.register(nib, forCellWithReuseIdentifier: "cell") 24 storeCollectionView.delegate = self 25 storeCollectionView.dataSource = self 26 let url = URL(string: "https://api.gnavi.co.jp/RestSearchAPI/v3/?keyid=[keyid]&latitude=35.7020691&longitude=139.7753269&range=2&sort=1&hit_per_page=100") 27 28 URLSession.shared.dataTask(with: url!) { (data, response, error) in 29 guard let data = data else {return} 30 do { 31 let json = try? JSON(data: data) 32 let jsonDataCount = json!["rest"].count 33 for listDataCount in 0...jsonDataCount{ 34 self.jsonData.append((name: json!["rest"][listDataCount]["name"].stringValue, 35 address: json!["rest"][listDataCount]["address"].stringValue, 36 access: json!["rest"][listDataCount]["access"].stringValue, 37 Image: json!["rest"][listDataCount]["image_url"]["shop_image1"].stringValue, 38 Web: json!["rest"][listDataCount]["url_mobile"].stringValue, 39 Mobile: json!["rest"][listDataCount]["tel"].intValue)) 40 } 41 print(self.jsonData) 42 43 } catch let jsonError{ 44 print("jsonError", jsonError) 45 } 46 }.resume() 47 self.storeCollectionView.reloadData() 48 } 49} 50 51extension ViewController: UICollectionViewDelegate,UICollectionViewDataSource,UICollectionViewDelegateFlowLayout { 52 func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { 53 return jsonData.count 54 } 55 56 func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { 57 let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) as! CollectionViewCell 58 cell.backgroundColor = UIColor.white 59 cell.layer.cornerRadius = 12 60 cell.layer.shadowOpacity = 0.4 61 cell.layer.shadowRadius = 12 62 cell.layer.shadowColor = UIColor.black.cgColor 63 cell.layer.shadowOffset = CGSize(width: 8, height: 8) 64 cell.layer.masksToBounds = false 65 cell.storeNameLabel?.text = jsonData[indexPath.row].name 66 cell.storeAccessLabel?.text = jsonData[indexPath.row].access 67 cell.storeLocationLabel?.text = jsonData[indexPath.row].address 68 cell.storeImageView?.image = UIImage(named: jsonData[indexPath.row].Image) 69 print(self.jsonData) 70 return cell 71 } 72 73 func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAt section: Int) -> CGFloat { 74 return 24 75 } 76 77 func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { 78 cellWidth = viewWidth-75 79 cellHeight = viewHeight-300 80 return CGSize(width: cellWidth, height: cellHeight) 81 } 82 83 84} 85
発生している問題・エラーメッセージ
ビルドすると画面が真っ白になる
printで検証するとAPIの取得処理はうまくいっていた
→
試したこと
そもそもUIViewControllerのフィールドでUICollectionViewを宣言していない
dataSourceとdelegateをしていない
registerしていない
reloadDataしていない
numberOfItemsInSectionとcellForItemAtをきちんと設定していない
sizeForItemAtをきちんと設定していない(こちらはセルだけが表示されない場合によくある)
withReuseIdentifierを一致させていない
そもそもクラスの継承がうまくいっていない
→考えられる原因は全て潰しました.
・clean buildとderiverd data実行済みです.
(追記)
最初の起動時に「app crashed」みたいなエラーが出ていたような気がします.
せっかちなのでボタン連打で読む前に消してしまったのですが,
二回目に起動したあとからは,そのエラーが表示されなくなりました.
補足情報(FW/ツールのバージョンなど)
Xcode 11(build-target: 12.0)
Swift 5.1
iphone 11のシミュレータで検証
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。