使用整体 NavigationStack 的带有 NavigationLink 的 Swiftui 菜单

问题描述 投票:0回答:1

我已阅读有关此主题的所有先前帖子,但似乎没有一篇能够解决我在 iOS 16 和使用 NavigationStack 中看到的内容。我还使用整体 @EnvironmentObject 来实现导航状态。

我有一个分割视图应用程序。在详细信息部分,我有一个围绕详细信息视图的 NavigationStack。在详细视图 (MyView) 中,有一个基础视图,工具栏中有一个“+”按钮,用于创建新实体。

这将打开 NewEntityView,其中我显示了一个按钮网格,供用户选择类型来创建新实体,然后再移动到 NewEntityView 以填写实体的详细信息。按钮网格的顶行通过 NavigationLink 将用户直接带到 NewEntityView。这些工作正常。

下一行按钮显示子类型菜单,然后应将用户带到 NewEntityView 视图。这些按钮不起作用。

代码(简化以免混乱):

SplitViewDetailView:

struct SplitViewDetailView: View {

    @EnvironmentObject var navigationManager: NavigationStateManager

    @Binding var selectedCategory: Route?

    var body: some View {
    
        NavigationStack(path: $navigationManager.routes) {
            // other irrelevant stuff
            MyView()
        }
        .environmentObject(navigationManager)
        .navigationDestination(for: Route.self) { $0 }
    }
}

我的观点:

struct MyView: View {
    @EnvironmentObject var navigationManager: NavigationStateManager

    var body: some View {
         List {
            // other stuff
         }
         .toolbar {
            ToolbarItem(placement: .navigationBarTrailing) {
               Button(action: {}, label: {
                  NavigationLink(value: Route.newTypeSelect) {
                    Image(systemName: "plus")
                        .frame(width: 44, height: 44)
                  }
               } )
            }
       }
       .navigationDestination(for: Route.self) { $0 }
}

选择类型视图:

struct SelectTypeView: View {

  var body: some View {

    ZStack {
        VStack {
            // Top row with no subtypes
            HStack {
                ForEach (topRows, id: \.self) { type in
                    NavigationLink(value: Route.newEntityDetails(type.rawValue)) { <-- these work
                       Text(type)
                    }
                }
            }
            HStack {
               ForEach (middleRow, id: \.self) { type in
                   Menu {
                       ForEach (subtype[type], id: \.self) { sub in
                           NavigationLink(value: Route.newEntityDetails(sub.rawValue)) {  <-- these go nowhere
                               Text(sub)
                           }
                         }
                     } label: {              
                         Text(type)
                     }
                   }
                }
            }
        }
    }
}

导航状态管理器:

class NavigationStateManager: ObservableObject {

    @Published var routes = [Route]()
    // other stuff
}

路线:

enum Route: Identifiable {
    var id: UUID { UUID() }

    case newTypeSelect
    case newEntityDetails(String)

}
extension Route: View {

   var body: some View {
    
       switch self {
         case .newTypeSelect:
            SelectTypeView()
         case .newEntityDetails(let type):
            NewEntityView(selectedType: type)
       }
   }
}

菜单显示正常,但点击某个项目没有任何反应。我试图将菜单包装在它自己的 NavigationStack 中,但被拒绝,因为它已经在父视图定义的菜单中。我尝试过制作带有目的地的链接按钮,但这些也被拒绝了。

使用导航链接呈现菜单的最新/最佳方式是什么?如果使用 NavigationStack,不会简单地将菜单包装在 NavigationView 中吗?

swiftui menu swiftui-navigationlink swiftui-navigationstack
1个回答
0
投票

您可以直接追加到

NavigationPath

使用

Button
append
routes

navigationManager.routes.append(Route.newEntityDetails(sub.rawValue)
© www.soinside.com 2019 - 2024. All rights reserved.