ios SwiftUI NavigationStack始终弹出到根目录

3mpgtkmj  于 5个月前  发布在  iOS
关注(0)|答案(2)|浏览(84)

我最近更新了我的应用程序中的导航,不再使用大量的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
让我知道,如果有任何更多的信息,可以帮助,并感谢任何建议

k4ymrczo

k4ymrczo1#

我不确定你的AppView枚举是什么样子的,但这里是你提供的代码的工作版本。
一个简短的说明:我建议您将NavigationPath直接移动到拥有NavigationStack的视图中,作为@State属性(这样您就可以使用NavigationLink s,而不必通过environmentObject修饰符传递navController)。

@main
struct StackDeleteApp: App {
    var body: some Scene {
        WindowGroup {
            HomeCoordinatorView()
        }
    }
}

enum AppView: Hashable {
    case postView(String)
    case userView(String)
}

class NavigationController: ObservableObject {
    @Published var homeNavPath = NavigationPath()

    func navigateTo(_ destination: AppView) {
        homeNavPath.append(destination)
    }
}

struct HomeCoordinatorView: View {
    @StateObject var navController = NavigationController()

    var body: some View {
        NavigationStack(path: $navController.homeNavPath) {
             HomeView()
                .environmentObject(navController)
                .navigationDestination(for: AppView.self) { appView in
                    switch appView {
                    case .postView(let post):
                        PostView(post: post)
                            .environmentObject(navController)
                    case .userView(let user):
                        UserView(user: user)
                            .environmentObject(navController)
                    }
                }
         }
    }
}

struct HomeView: View {
    @EnvironmentObject var navController: NavigationController

    var body: some View {
        Text("GO TO USER").onTapGesture {
            navController.navigateTo(.userView("123"))
        }
    }
}

struct PostView: View {
    let post: String
    @EnvironmentObject var navController: NavigationController

    var body: some View {
        Text("GO TO USER").onTapGesture {
            navController.navigateTo(.userView("123"))
        }
    }
}

struct UserView: View {
    let user: String
    @EnvironmentObject var navController: NavigationController

    var body: some View {
        Text("GO TO POST").onTapGesture {
            navController.navigateTo(.postView("123"))
        }
    }
}

字符串

gc0ot86w

gc0ot86w2#

我花了一段时间,但我找到了解决办法。
问题是我在哪里声明了我的navigationDestination
我有以下设置(我在我的问题中简化了它)。

    private let homeView = HomeView()   
    NavigationStack(path: $navController.homeNavPath) {
      homeView
    }

个字符
似乎有两种方法可以解决这个问题。要么我需要直接在NavigationStack中调用HomeView()(但我确信我最初没有这样做是出于某种原因......),要么我可以将navigationDestiation{}调用移动到类似于其中任何一个。所有这些都可以解决这个问题,尽管我不是100%确定如何解决:

private let homeView = HomeView()   
    NavigationStack(path: $navController.homeNavPath) {
      homeView.navigationDestiation{...}
    }


private let homeView = HomeView().navigationDestiation{...} 
    NavigationStack(path: $navController.homeNavPath) {
      homeView
    }


如果有人能解释一下为什么这会起作用,

相关问题