J'ai essayé de répliquer une de mes applications à l'aide de SwiftUI. Il a un RootViewController qui, selon une valeur d'énumération, montre un contrôleur de vue enfant différent. Comme dans SwiftUI, nous utilisons des vues au lieu de contrôleurs de vue, mon code ressemble à ceci:
struct RootView : View {
@State var containedView: ContainedView = .home
var body: some View {
// custom header goes here
switch containedView {
case .home: HomeView()
case .categories: CategoriesView()
...
}
}
}
Malheureusement, je reçois un avertissement:
La fermeture contenant l'instruction de flux de contrôle ne peut pas être utilisée avec le générateur de fonctions
ViewBuilder
.
Alors, existe-t-il des alternatives pour basculer afin que je puisse reproduire ce comportement?
Vous devez encapsuler votre code dans une vue, telle que VStack
ou Group
:
var body: some View {
Group {
switch containedView {
case .home: HomeView()
case .categories: CategoriesView()
...
}
}
}
ou, l'ajout de valeurs de retour devrait fonctionner:
var body: some View {
switch containedView {
case .home: return HomeView()
case .categories: return CategoriesView()
...
}
}
Cependant, la meilleure méthode pour résoudre ce problème serait de créer une méthode qui renvoie une vue:
func nextView(for containedView: YourViewEnum) -> some AnyView {
switch containedView {
case .home: return HomeView()
case .categories: return CategoriesView()
...
}
}
var body: some View {
nextView(for: containedView)
}