首页 > 解决方案 > 在我的 iOS 应用中的视图之间构建导航

问题描述

随着时间的推移,通过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)

不,我意识到它已经变得一团糟..是时候让我重新考虑一下了..

您如何处理应用程序中的导航,这些导航不能总是通过从导航堆栈中推送/弹出视图来完成?

标签: swiftuiswiftui-navigationlinkswiftui-navigationview

解决方案


在这里使用 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")
    }
}

推荐阅读