SwiftUI ViewBuilder 块中 switch 语句的替代方法? [英] Alternative to switch statement in SwiftUI ViewBuilder block?
问题描述
⚠️ 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屋!