【问题标题】:Building navigation between Views in my iOS app在我的 iOS 应用程序中构建视图之间的导航
【发布时间】:2021-02-12 11:21:28
【问题描述】:

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

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

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

【问题讨论】:

    标签: swiftui swiftui-navigationlink swiftui-navigationview


    【解决方案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")
        }
    }
    

    【讨论】:

    • 谢谢。已经在谷歌上搜索有关此方法的更多信息
    • @eugene_prg 我刚刚添加了一个您可以复制和粘贴的用例,以便您感受一下。 ViewBuilders 可以返回简单的视图,例如文本,或带有嵌套 VStack、HStack 等的完整加载视图。
    猜你喜欢
    • 1970-01-01
    • 2014-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多