web-dev-qa-db-fra.com

Alternative pour changer d'instruction dans le bloc SwiftUI ViewBuilder?

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?

33
Nikolay Marinov

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)
}
0
LinusGeffarth