一尘不染

在SwiftUI ViewBuilder块中切换语句的替代方法?

swift

2020年6月23日编辑:从Xcode 12开始,ViewBuilder将同时支持switch和let语句!

我一直在尝试使用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()
         ...
      }
   }
}

不幸的是,我收到警告:

包含控制流语句的闭包不能与function builder一起使用ViewBuilder

因此,是否有其他选择可以切换,以便我可以复制此行为?


阅读 386

收藏
2020-07-07

共1个答案

一尘不染

️2020年6月23日编辑:从Xcode 12开始,ViewBuilder将同时支持switch和let语句!

谢谢大家的回答。我已经在 Apple开发论坛 上找到了解决方案。 基尔·吉拉德Kiel Gillard)
回答了。解决方案是按照Lu_,Linus和Mo的建议在函数中提取开关,但是我们必须包装视图AnyView才能使其起作用–如下所示:

struct RootView: View {
  @State var containedViewType: ContainedViewType = .home

  var body: some View {
     VStack {
       // custom header goes here
       containedView()
     }
  }

  func containedView() -> AnyView {
     switch containedViewType {
     case .home: return AnyView(HomeView())
     case .categories: return AnyView(CategoriesView())
     ... 
  }
}
2020-07-07