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

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

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

TableView(UITableView)とは、リスト形式で表示するコントロールで、ほとんどのアプリに使用されています。画面を「行」に分けて管理し、一般的には各行をタップした際に詳細画面に移動します。

RxSwift

RxSwiftは、Reactive ExtensionsのSwift向けの実装です。iOS開発に用いられ、リアクティブプログラミングを可能にします。

MVVM

MVVM(Model View ViewModel)は構築上のデザインパターンで、表現ロジック(ViewModel)によってデータ(Model)からページ(View)を分離させます。

Swift

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

Q&A

解決済

1回答

1992閲覧

Swiftで動的な要素を含んだViewで縦スクロールする方法

seiya_orz

総合スコア24

TableView

TableView(UITableView)とは、リスト形式で表示するコントロールで、ほとんどのアプリに使用されています。画面を「行」に分けて管理し、一般的には各行をタップした際に詳細画面に移動します。

RxSwift

RxSwiftは、Reactive ExtensionsのSwift向けの実装です。iOS開発に用いられ、リアクティブプログラミングを可能にします。

MVVM

MVVM(Model View ViewModel)は構築上のデザインパターンで、表現ロジック(ViewModel)によってデータ(Model)からページ(View)を分離させます。

Swift

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

0グッド

1クリップ

投稿2017/08/03 15:19

###前提・実現したいこと
RxSwiftとMVVMを使ってiOSアプリの開発を行っております。只今、アプリのホーム的な画面を作成しております。イメージとしては、クックパッドの起動時に表示される画面のような、縦スクロールができ、行ごとに動的に要素が変更されるものを作ろうとしています。

この画面はおそらくですが、TableViewを使い、Cellごとに異なるCustomCellで描画しているのではないかと考えています。ただ、そこから先の実装方法がわかりません。

###わからないこと
下記コードのように、ViewModelのitemsをTableViewにbindして、TableViewを描画すると思っています。

lang

1// ViewController 2 3viewModel.items.bind(to: tableView.rx.items) { tableView, cell, element in 4 // ここでelementに応じてCustomCellをつくってreturnする? 5}

この際、itemsの型は構造体の配列になるかと思うのですが、各Cell毎に全く異なる要素を表示するため、同一の構造体にすることができません。無理やる方法としては、下記の様な構造体を用意し、itemsを[Item]として、上記コードのクロージャ内でtypeで分岐して、bodyをキャストして扱う方法はありそうな気がしています。

lang

1struct Item { 2 let type: ItemType 3 let body: Any 4}

しかし、このAnyにダウンキャストしている時点で、Swift的にはあまり良いコードではないと考えております。どのように実装すればよいのでしょうか?ご教示いただければ幸いです。

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

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

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

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

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

guest

回答1

0

ベストアンサー

色々方法はありそうですがプロトコルを使えば

swift

1 2protocol CellProvider { 3 func makeCell(for tableView: UITableView) -> UITableViewCell 4} 5 6 7struct BodyA: CellProvider { 8 func makeCell(for tableView: UITableView) -> UITableViewCell { 9 let cell = tableView.dequeueReusableCell(withIdentifier: "CellA")! 10 // セルの設定 11 return cell 12 } 13} 14struct BodyB: CellProvider { ... } // 表示内容ごとに作る 15

とすれば items[CellPrvider]とすることで

swift

1viewModel.items.bind(to: tableView.rx.items) { tableView, row, element in 2 3 return element.makeCell(for: tableView) 4}

でいけるのではないでしょうか。

すでにデータがある場合は extensionでプロトコルを採用すればよいです。

動作確認はしてないです。

投稿2017/08/04 08:29

MasakiHori

総合スコア3384

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

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

seiya_orz

2017/08/04 10:57

ご回答ありがとうございました。私も動作を確認してはいませんが、この方法で実装するイメージが付きました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問