🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
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

解決済

2回答

1299閲覧

【Swift5】 シミュレータでUIが表示されない, 画面が真っ白になる

weekplane

総合スコア29

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/12/31 07:00

編集2019/12/31 07:07

前提・実現したいこと

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のシミュレータで検証

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

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

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

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

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

guest

回答2

0

自己解決

全部で15箇所くらい間違ってたのでそれらを地道に解決していきました.答えになってなくてすみません.
主な原因は,配列のappendがきちんとうまくいっていなかったので,for in文のどこかにバグがあったようです.

同じような不具合で困っている人は,変数のチェックをしたりライブラリと記述方法を変えてみるなど色々と試してみると良いかもしれません.

投稿2020/01/03 07:25

weekplane

総合スコア29

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

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

0

真っ白ってなんですか?
ViewControllerの背景は何色ですか?collectionViewの背景は何色ですか?
それぞれちがう色を付けて表示してみると何が写ってるのか(collectionViewが写ってないのか?ViewControllerも写ってないのか?)わかると思います。

それと、rnumberOfItemsInSectionの中のreturnの前でjsonData.countがいくつか確認してください。

投稿2020/01/01 08:32

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

weekplane

2020/01/01 09:07 編集

ご回答ありがとうございます。色の変更は試したのですが、vcとcollection viewの背景はどちらも白なのですが、どちらの色を変えても出力結果は白のままです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問