我最近更新了我的应用程序中的导航,不再使用大量的NavigationLinks,因为我看到了多次推送到导航堆栈的错误。
我的应用程序现在可以很好地使用自定义的navcontroller,它可以自动地将视图添加到堆栈中,但是有一个问题,当我试图使用工具栏上的后退按钮弹回到前一个视图时,它总是一路弹回到根目录,一个接一个地遍历所有的子视图。
以下是当前设置的概述:
导航控制器-
class NavigationController: ObservableObject {
@Published var homeNavPath: [AppView] = []
public func navigateTo(destination: AppView) {
homeNavPath.append(destination)
}
字符串
}
导航栈-
NavigationStack(path: $navController.homeNavPath) {
HomeView()
}
型
导航示例-
public struct HomeView: View {
@EnvironmentObject var navController: NavigationController
public var body: some View {
Text("GO TO POST").onTapGesture {
navController.navigateTo(PostView("123"))
}
}
}
public struct PostView: View {
@EnvironmentObject var navController: NavigationController
public var body: some View {
Text("GO TO USER").onTapGesture {
navController.navigateTo(UserView("123"))
}
}
}
public struct UserView: View {
@EnvironmentObject var navController: NavigationController
public var body: some View {
Text("USER INFORMATION...")
}
}
型
我能够像预期的那样完美地从Home -> Post -> User导航,但是当我按下用户页面上的后退按钮时,无论导航路径有多长,它都会导航回根目录(例如,在这种情况下是home)。
这里有一个例子,我只按了一次后退按钮:
example navigation gif
让我知道,如果有任何更多的信息,可以帮助,并感谢任何建议
2条答案
按热度按时间k4ymrczo1#
我不确定你的
AppView
枚举是什么样子的,但这里是你提供的代码的工作版本。一个简短的说明:我建议您将
NavigationPath
直接移动到拥有NavigationStack
的视图中,作为@State
属性(这样您就可以使用NavigationLink
s,而不必通过environmentObject
修饰符传递navController
)。字符串
gc0ot86w2#
我花了一段时间,但我找到了解决办法。
问题是我在哪里声明了我的
navigationDestination
。我有以下设置(我在我的问题中简化了它)。
个字符
似乎有两种方法可以解决这个问题。要么我需要直接在NavigationStack中调用HomeView()(但我确信我最初没有这样做是出于某种原因......),要么我可以将
navigationDestiation{}
调用移动到类似于其中任何一个。所有这些都可以解决这个问题,尽管我不是100%确定如何解决:型
或
型
如果有人能解释一下为什么这会起作用,