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

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

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

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

Q&A

解決済

1回答

682閲覧

SwiftUIでUIPageViewControllerとSegmentedControlを使い 型の異なるページ(クラスが違う)を表示したいです

yasumaro

総合スコア67

Swift

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

1グッド

1クリップ

投稿2020/01/11 15:21

編集2020/01/11 17:13

SwiftUIでUIPageViewControllerとSegmentedControlを使い
型の異なるページ(クラスが違う)を表示したいです。

下記のURLで実装していますが配列なので自作した異なる型を表示できません。
どうすればできるでしょうか?何か良い方法はないでしょうか。(コード内にメモあります)

https://masamichi.me/development/2019/10/12/swiftui-pageview.html

struct ContentView: View { @State private var page = 0 var body: some View { VStack { Picker("Page", selection: $page) { Text("Page 1").tag(0) Text("Page 2").tag(1) } .pickerStyle(SegmentedPickerStyle()) .padding(EdgeInsets(top: 0, leading: 12, bottom: 0, trailing: 12)) //↓↓ここが配列で同じText("Page1")を表示しているが別の型も混じったページを表示したい        PageView([ Text("Page1"), Text("Page2") // こういう風に自作した型を表示したいです。 // MeetsListView(), // VegetablesList() ], currentPage: $page) } } }

表示するページのソースです。1ページめ

import SwiftUI struct MeetsListView: View { @EnvironmentObject var userData: UserData //MARK: - メイン var body: some View { ScrollView { VStack { HStack{ Spacer() ProductCell(product: userData.products[0]) Spacer() ProductCell(product: userData.products[1]) Spacer() ProductCell(product: userData.products[2]) Spacer() } } }//body }

表示するページのソースです。2ページめクラスが違います。
内容はほとんど同じで変数が違うだけです。ページを切り分けたい為だけにクラスを分けています。

import SwiftUI struct VegetablesList: View { @EnvironmentObject var userData: UserData //MARK: - メイン var body: some View { ScrollView { VStack { HStack{ Spacer() ProductCell(product: userData.products[3]) Spacer() ProductCell(product: userData.products[4]) Spacer() ProductCell(product: userData.products[5]) Spacer() } } }//body }

上記のつまずいている箇所のPageViewクラスは記載のURLでもありますがこうなっています

struct PageView<Page: View>: View { var viewControllers: [UIHostingController<Page>] @Binding var currentPage: Int init(_ views: [Page], currentPage: Binding<Int>) { self._currentPage = currentPage self.viewControllers = views.map { UIHostingController(rootView: $0) } } var body: some View { PageViewController(controllers: viewControllers, currentPage: $currentPage) } }
taichi_dm_👍を押しています

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

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

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

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

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

guest

回答1

0

ベストアンサー

https://stackoverflow.com/questions/56645647/how-to-have-a-dynamic-list-of-views-using-swiftui
が参考になると思いますが、

swift

1PageView([ 2 AnyView(MeetsListView()), 3 AnyView(VegetablesList()) 4], currentPage: $page)

のようにして、AnyViewで包めばうまくいくと思います。

投稿2020/01/12 01:11

編集2020/01/12 01:13
TakeOne

総合スコア6299

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

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

yasumaro

2020/01/12 03:39

ありがとうございます! 望んでいた挙動を実現できました^^ 参考URLの記載まで上げていただき助かります><
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問