随着时间的推移,App 的形状越来越复杂。
在某些情况下,应用流程可能是:
视图 A -> 视图 B -> C -> D 然后回来 D -> C -> B -> A..
但有时我需要跳过视图然后去 D -> B -> A..
在某些情况下是 A -> C -> D 然后是 D -> A
我开始使用 NavigationView/NavigationLink,在某些情况下我使用以下方法:
let weekView = WeekView(journey: journey, isRoot: isRoot).environmentObject(self.thisSession)
window?.rootViewController = UIHostingController(rootView: weekView)
不,我意识到它已经变得一团糟..是时候重新思考这个了..
在无法通过从导航堆栈推送/弹出视图来完成的应用中,您如何处理导航?
答案 0 :(得分:1)
在这里使用 ViewBuilders 是一个不错的选择。
@ViewBuilder func myViewRouter(selection: Selection) -> some View {
switch selection {
case selection1:
View1()
case selection2:
View2()
case selection3:
View3()
}
}
enum Selection { ... }
ViewBuilders 很强大,它几乎是一个可以返回不透明类型的函数,但请注意缺少 return 关键字。这似乎是它的完美用例。在示例中,我使用了一个枚举,但在父视图上使用 var selection = 0 并将 ViewBuilder 作为子视图也很常见。无论哪种方式,相同的功能。
以下是了解 ViewBuilders 的好网址。
https://swiftwithmajid.com/2019/12/18/the-power-of-viewbuilder-in-swiftui/
上次编辑:这是一个示例用例:
import SwiftUI
struct ContentView: View {
@State private var selection: SelectionEnum = .zero
var body: some View {
VStack {
showMyViews(selection: selection)
HStack {
ForEach(SelectionEnum.allCases, id: \.self) { selection in
Button(action: {self.selection = selection}){
Text(selection.rawValue)
.fontWeight(.bold)
.frame(width: 60, height: 60)
.foregroundColor(.white)
.background(Color.blue)
.cornerRadius(10)
}
}
}
}
}
@ViewBuilder func showMyViews(selection: SelectionEnum) -> some View {
switch selection {
case .zero:
ViewA()
case .one:
ViewB()
case .two:
ViewC()
case .three:
ViewD()
}
}
enum SelectionEnum: String, CaseIterable {
case zero
case one
case two
case three
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
struct ViewA: View {
var body: some View {
Text("View A")
}
}
struct ViewB: View {
var body: some View {
Text("View B")
}
}
struct ViewC: View {
var body: some View {
Text("View C")
}
}
struct ViewD: View {
var body: some View {
Text("View D")
}
}