私はSwiftUIを使用して私のアプリを複製しようとしています。列挙型の値に応じて、異なる子ビューコントローラーを表示するRootViewControllerがあります。 SwiftUIでは、ビューコントローラーの代わりにビューを使用するため、私のコードは次のようになります。
struct RootView : View {
@State var containedView: ContainedView = .home
var body: some View {
// custom header goes here
switch containedView {
case .home: HomeView()
case .categories: CategoriesView()
...
}
}
}
残念ながら、私は警告を受け取ります:
制御フローステートメントを含むクロージャは、関数ビルダー
ViewBuilder
では使用できません。
それで、この動作を再現できるように切り替える代替手段はありますか?
VStack
やGroup
などのビューでコードをラップする必要があります。
var body: some View {
Group {
switch containedView {
case .home: HomeView()
case .categories: CategoriesView()
...
}
}
}
または、戻り値の追加が機能するはずです:
var body: some View {
switch containedView {
case .home: return HomeView()
case .categories: return CategoriesView()
...
}
}
ただし、この問題を解決する最善の方法は、ビューを返すメソッドを作成することです。
func nextView(for containedView: YourViewEnum) -> some AnyView {
switch containedView {
case .home: return HomeView()
case .categories: return CategoriesView()
...
}
}
var body: some View {
nextView(for: containedView)
}