首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NavigationStack不受EnvironmentObject更改的影响

NavigationStack不受EnvironmentObject更改的影响
EN

Stack Overflow用户
提问于 2022-09-14 22:23:14
回答 1查看 291关注 0票数 2

我试图使用@EnvironmentObject来使用简单的包装器将@已发布的导航路径传递到SwiftUI NavigationStack,代码构建时没有问题,但是使用@EnvironmentObject没有任何影响。下面是一个简化的示例,它仍然显示了这个问题:

代码语言:javascript
复制
import SwiftUI

class NavigationCoordinator: ObservableObject {
    @Published var path = NavigationPath()

    func popToRoot() {
        path.removeLast(path.count)
    }
}

struct ContentView: View {
    @StateObject var navigationCoordinator = NavigationCoordinator()

    var body: some View {
        NavigationStack(path: $navigationCoordinator.path, root: {
            FirstView()
        })
            .environmentObject(navigationCoordinator)
    }
}

struct FirstView: View {
    var body: some View {
        VStack {
            NavigationLink(destination: SecondView()) {
                Text("Go To SecondView")
            }
        }
            .navigationTitle(Text("FirstView"))
    }
}

struct SecondView: View {
    var body: some View {
        VStack {
            NavigationLink(destination: ThirdView()) {
                Text("Go To ThirdView")
            }
        }
            .navigationTitle(Text("SecondView"))
    }
}

struct ThirdView: View {
    @EnvironmentObject var navigationCoordinator: NavigationCoordinator

    var body: some View {
        VStack {
            Button("Pop to FirstView") {
                navigationCoordinator.popToRoot()
            }
        }
            .navigationTitle(Text("ThirdView"))
    }
}

我是:

parameter

  • Sending

  • 通过.environmentObject() modifier

  • Pushing将简单的ObservableObject实例传递到NavigationStack path中,在试图使用环境对象时,将几个简单的子视图传递到stack

  • Attempting上,以便在ThirdView

  • NOT中使用环境对象(例如,“没有发现ObservableObject of NavigationCoordinator”)

我是否遗漏了其他可以阻止深度叠加视图使用EnvironmentObject来影响NavigationStack路径的东西?似乎NavigationStack只是不尊重绑定路径。

(iOS 16.0,Xcode 14.0)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-09-15 06:24:02

您的代码不能工作的原因是您没有向路径添加任何内容,所以路径是空的。您可以通过在您的print(path.count)方法中添加popToRoot来验证这一点--它将在控制台中打印0

要使用NavigationPath,您需要使用navigationDestination(for:destination:) ViewModifier,因此在您的示例中,您可以尝试这样的方法。

内容视图:-会像这样改变NavigationStack

代码语言:javascript
复制
NavigationStack(path: $navigationCoordinator.path) {
    VStack {
        NavigationLink(value: 1) {
            Text("Go To SecondView")
        }
    }
    .navigationDestination(for: Int.self) { i in
        if i == 1 {
            SecondView()
        }
        else {
            ThirdView()
        }
    }
}

SecondView:-像这样改变NavigationLink

代码语言:javascript
复制
NavigationLink(value: 2) {
    Text("Go To ThirdView")
}

此解决方案适用于Int,但并不是一种更好的方法,因此我的建议是使用自定义数组作为路径。就像这样。

代码语言:javascript
复制
enum AppView {
    case second, third
}

class NavigationCoordinator: ObservableObject {
    @Published var path = [AppView]()
}

NavigationStack(path: $navigationCoordinator.path) {
    FirstView()
        .navigationDestination(for: AppView.self) { path in
            switch path {
            case .second: SecondView()
            case .third: ThirdView()
            }
        }
}

现在,将NavigationLink中的FirstViewSecondView更改为这样。

代码语言:javascript
复制
NavigationLink(value: AppView.second) {
    Text("Go To SecondView")
}

NavigationLink(value: AppView.third) {
    Text("Go To ThirdView")
}

上面的好处是,现在您也可以使用按钮按下一个新的屏幕,只需要附加在您的路径。

代码语言:javascript
复制
path.append(.second)
//OR
path.append(.third)

这将推动一种受人尊敬的观点。

有关更多细节,您可以阅读NavigationLinkNavigationPath的苹果文档。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73723771

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档