我试图使用@EnvironmentObject来使用简单的包装器将@已发布的导航路径传递到SwiftUI NavigationStack,代码构建时没有问题,但是使用@EnvironmentObject没有任何影响。下面是一个简化的示例,它仍然显示了这个问题:
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
path中,在试图使用环境对象时,将几个简单的子视图传递到stack
我是否遗漏了其他可以阻止深度叠加视图使用EnvironmentObject来影响NavigationStack路径的东西?似乎NavigationStack只是不尊重绑定路径。
(iOS 16.0,Xcode 14.0)
发布于 2022-09-15 06:24:02
您的代码不能工作的原因是您没有向路径添加任何内容,所以路径是空的。您可以通过在您的print(path.count)方法中添加popToRoot来验证这一点--它将在控制台中打印0。
要使用NavigationPath,您需要使用navigationDestination(for:destination:) ViewModifier,因此在您的示例中,您可以尝试这样的方法。
内容视图:-会像这样改变NavigationStack。
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。
NavigationLink(value: 2) {
Text("Go To ThirdView")
}此解决方案适用于Int,但并不是一种更好的方法,因此我的建议是使用自定义数组作为路径。就像这样。
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中的FirstView和SecondView更改为这样。
NavigationLink(value: AppView.second) {
Text("Go To SecondView")
}
NavigationLink(value: AppView.third) {
Text("Go To ThirdView")
}上面的好处是,现在您也可以使用按钮按下一个新的屏幕,只需要附加在您的路径。
path.append(.second)
//OR
path.append(.third)这将推动一种受人尊敬的观点。
有关更多细节,您可以阅读NavigationLink和NavigationPath的苹果文档。
https://stackoverflow.com/questions/73723771
复制相似问题