描述
以前,您可以使用NavigationLink(isActive:, destination:, label:)进行编程式导航,当isActive参数为true时触发导航。在IOS 16中,这个函数已经被弃用,并引入了NavigationStack, NavigationLink(value:, label:)和NavigationPath。
要了解其用法,请按照以下链接:
https://developer.apple.com/documentation/swiftui/migrating-to-new-navigation-types https://www.hackingwithswift.com/articles/250/whats-new-in-swiftui-for-ios-16(搜索NavigationStack)
我的问题是:如果我想在不同的视图和它们的ViewModel中使用并维护包含导航栈内容的数组(如NavigationPath对象),该如何做呢?
如下代码所示,我创建了一个NavigationPath对象来保存BaseView或BaseView.ViewModel中的导航栈。这样我就可以从BaseView进行程序化导航到其他页面(Page1、Page2),这很棒。
但是,如果我进入Page1并尝试从那里进行程序化导航到Page2,我需要访问原始的NavigationPath对象,也就是我在BaseView中使用的那个。
如何访问这个原始对象最好呢?
我可能误解了此新功能的用法,但如果您有任何可能的解决方案来实现ViewModel的程序化导航,我将不胜感激:)
代码
我尝试过的:
struct BaseView: View {
@StateObject var viewModel = ViewModel()
var body: some View {
NavigationStack(path: $viewModel.paths) {
VStack {
Button("Page 1", action: viewModel.goToPage1)
Button("Page 2", action: viewModel.goToPage2)
}
.navigationDestination(for: String.self) { stringParam in
Page1(stringParam: stringParam)
}
.navigationDestination(for: Int.self) { intParam in
Page2(intParam: intParam)
}
}
}
}
extension BaseView {
@MainActor class ViewModel: ObservableObject {
@Published var paths = NavigationPath()
func goToPage1() {
let param = "Some random string" // gets the parameter from some calculation or async network call
paths.append(param)
}
func goToPage2() {
let param = 19 // gets the parameter from some calculation or async network call
paths.append(param)
}
}
}
struct Page1: View {
@StateObject var viewModel = ViewModel()
let stringParam: String
var body: some View {
VStack {
Button("Page 2", action: viewModel.goToPage2)
}
}
}
extension Page1 {
@MainActor class ViewModel: ObservableObject {
func goToPage2() {
// Need to add value to the original paths variable in BaseView.ViewModel
}
}
}
struct Page2: View {
@StateObject var viewModel = ViewModel()
let intParam: Int
var body: some View {
Text("\(intParam)")
}
}
extension Page2 {
@MainActor class ViewModel: ObservableObject {
}
}