swift - 替代 SwiftUI ViewBuilder block 中的 switch 语句?

标签 swift swiftui

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

我一直在尝试使用 SwiftUI 复制我的一个应用程序。它有一个 RootViewController,它根据枚举值显示不同的 subview Controller 。与在 SwiftUI 中一样,我们使用 View 而不是 View Controller ,我的代码如下所示:

struct RootView : View {
   @State var containedView: ContainedView = .home

   var body: some View {
      // custom header goes here
      switch containedView {
         case .home: HomeView()
         case .categories: CategoriesView()
         ...
      }
   }
}

不幸的是,我收到警告:

Closure containing control flow statement cannot be used with function builder ViewBuilder.

那么,是否有任何替代方案可以让我复制这种行为?

最佳答案

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

谢谢大家的回答。我在 Apple 的开发论坛 上找到了解决方案。 Kiel Gillard 回答了这个问题。解决方案是按照 Lu_、Linus 和 Mo 的建议将开关提取到函数中,但我们必须将 View 包装在 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())
     ... 
  }
}

关于swift - 替代 SwiftUI ViewBuilder block 中的 switch 语句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56736466/

相关文章:

ios - 无法为自定义栏按钮设置标题?

集合的 Swift 扩展

swift - ARSCNView 圆角半径未显示

ios - 条形按钮项目图像(UIImage)颜色随色调变化?

json - 使用 ForEach 的多个 NavigationLink

button - 如何在 SwiftUI 中创建图像按钮

ios - UIStackView 没有显示阴影

swift - 如何在 Xcode 构建中使 USDZ 背景透明/黑色?

swift - 水平(或在网格中)而不是垂直布局多个 SwiftUI 预览?

ios - 对于列表详细信息界面 - 数据在详细信息 View 中更新,数据发生更改但不会立即反射(reflect)在详细信息 View 中