SwiftUI ViewBuilder 块中 switch 语句的替代方法? [英] Alternative to switch statement in SwiftUI ViewBuilder block?

查看:54
本文介绍了SwiftUI ViewBuilder 块中 switch 语句的替代方法?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

我一直在尝试使用 SwiftUI 复制我的应用程序.它有一个 RootViewController,它根据枚举值显示不同的子视图控制器.就像在 SwiftUI 中我们使用视图而不是视图控制器一样,我的代码如下所示:

I’ve been trying to replicate an app of mine using SwiftUI. It has a RootViewController which, depending on an enum value, shows a different child view controller. As in SwiftUI we use views instead of view controllers, my code looks like this:

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

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

不幸的是,我收到一条警告:

Unfortunately, I get a warning:

包含控制流语句的闭包不能与函数构建器ViewBuilder一起使用.

那么,是否有其他替代方法可以切换,以便我可以复制这种行为?

So, are there any alternatives to switch so I can replicate this behaviour?

推荐答案

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

谢谢你们的回答,伙计们.我在 Apple 的开发论坛上找到了解决方案.Kiel Gillard 对此做出了回答.解决方案是像 Lu_、Linus 和 Mo 建议的那样在函数中提取开关,但是我们必须将视图包装在 AnyView 中才能使其工作 - 就像这样:

Thanks for the answers, guys. I’ve found a solution on Apple’s Dev Forums. It’s answered by Kiel Gillard. The solution is to extract the switch in a function as Lu_, Linus and Mo suggested, but we have to wrap the views in AnyView for it to work – like this:

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())
     ... 
  }
}

这篇关于SwiftUI ViewBuilder 块中 switch 语句的替代方法?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆