️ 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。
ViewBuilder
因此,是否有其他选择可以切换,以便我可以复制此行为?
️2020年6月23日编辑:从Xcode 12开始,ViewBuilder将同时支持switch和let语句!
谢谢大家的回答。我已经在 Apple开发论坛 上找到了解决方案。 基尔·吉拉德 ( Kiel Gillard) 回答了。解决方案是按照Lu_,Linus和Mo的建议在函数中提取开关,但是我们必须包装视图AnyView才能使其起作用–如下所示:
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()) ... } }