我已阅读有关此主题的所有先前帖子,但似乎没有一篇能够解决我在 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 中吗?
您可以直接追加到
NavigationPath
使用
Button
和 append
至 routes
navigationManager.routes.append(Route.newEntityDetails(sub.rawValue)