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

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

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

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

Q&A

1回答

1364閲覧

【Swift】縦横スクロールのデータ展開ができない

k_itani

総合スコア0

Swift

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

0グッド

0クリップ

投稿2020/07/28 08:24

前提・実現したいこと

Swift初心者です。
参考書やWebsiteを参考に開発を進めているのですが、
タイトルのように縦横スクロールできる画面を作成したく、以下のサイトを参考にViewの作成を行いました。
https://qiita.com/misakiagata/items/5c66fa69d72897474209

イメージ説明
※縦のタイトルはAPIにより取得し、タイトルに関連する画像を横スワイプに展開するためAPIより取得、縦、横ともにインフィニットにスクロールする要件となっています。

発生している問題・エラーメッセージ

viewDidLoad内でAPIをコールし、データを取得しており、
UITableViewのタイトルデータとUICollectionView内のデータはAPIのレスポンスによって内容が変わります。
APIで取得したデータをどのようにコントロールし、どこでUICollectionView内のデータとして展開すれば良いかが分からない状態で困っています。
解決策と原因を教えていただきたいです。

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

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

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

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

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

guest

回答1

0

Qiita の記事に合わせれば、下記のあたりで表示するようにすれば良いかと思います。
ただし、画像そのものの取得は非同期で別途行う必要がありますのでご注意ください。

Swift

1extension ContentsViewController: UITableViewDelegate, UITableViewDataSource { 2 // 中略 3 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 4 let cell = tableView.dequeueReusableCell(withIdentifier: "ContentsTableViewCell", for: indexPath) as! ContentsTableViewCell 5 6 // tableView のタイトルはここでセットする 7 cell.titleLabel.text = "(indexPath.row + 1)行目" 8 cell.setCollectionViewDataSourceDelegate(dataSourceDelegate: self, forRow: indexPath.row) 9 cell.contentsCollectionView.reloadData() 10 return cell 11 } 12 // 後略 13} 14 15extension ContentsViewController: UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout { 16 // 中略 17 func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { 18 let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "ContentsCollectionViewCell", for: indexPath) as! ContentsCollectionViewCell 19 20 // CollectionView の画像はここでセットする 21 // ここでは空の画像、ランダムな背景色をセット 22 cell.contentsImageView.image = UIImage() 23 var colors: [UIColor] = [.red, .black, .blue, .brown, .cyan, .green, .magenta] 24 cell.contentsImageView.backgroundColor = colors[Int.random(in: 0..<colors.count)] 25 26 return cell 27 28 } 29 // 後略 30}

投稿2020/07/28 10:24

TsukubaDepot

総合スコア5086

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

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

k_itani

2020/07/28 10:54

早々のご回答ありがとうございます。 APIで取得したデータは、collectionView(_:cellForItemAt:)内で展開するということでしょうか? 勉強不足で恐縮ですが、ご教示いただけますと幸いです。
TsukubaDepot

2020/07/28 10:59

そういうことになりますが、k_itaniさんが具体的にどのタイミングで、どのような方法で取得されるかによって詳細は異なってくるかと思います。 大雑把に言えば 1. APIから非同期でデータを取得し、何らかの形式で保存する 2. 保存が完了したら collectionView のリロードを行う という流れになるかと思います。
k_itani

2020/07/28 11:27

認識が間違ってたらすみませんが、 collectionView(_:cellForItemAt:)内でデータを取得するAPIをコールし、レスポンスデータを配列に格納したものを表示するということであってますか? また、その場合、TableViewとCollectionViewとのデータの紐付けはどのようにすればよろしいでしょうか?
TsukubaDepot

2020/07/28 11:34

そこでAPIからデータを取得しようと試みても正常に取得できません(セルを生成する瞬間にAPIからデータが取得できない、つまり完全なリアルタイム処理ができないため)。 もし、この点のご理解が及んでいないようであれば、まずは非同期ネットワーク処理のあたりに関する知識を整理された方が、最終的なご理解は早いかもしれません。 例えば、関連する質問はこの辺りがあります。 https://teratail.com/questions/280659
k_itani

2020/07/28 11:58

ご指摘ありがとうございます。 TsukubaDepotのおっしゃる通り、この辺りの理解はあまりできてないと思います。 参考ページのご共有ありがとうございます。こちらを参考に勉強してみます。
TsukubaDepot

2020/07/28 12:09

たとえば、tableViewにWebAPIで取得したデータを表示できるようになれば、理解も進むと思います(ちなみに、WebAPIからデータを取得してtableViewに表示するサンプルは、大抵の初心者本にも掲載されています)。 参考にされている記事は有用ではあるのですが、tableViewにCollectionViewも載せている例なので、その階層構造もきちんと理解する必要がありそうです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問