![](/img/trans.png)
[英]How does one use NavigationLink isActive binding when working with List in SwiftUI?
[英]SwiftUI NavigationLink isActive Binding Not Updated/Working
我有以下内容:
@State private var showNext = false
...
NavigationStack {
VStack {
NavigationLink(destination: NextView(showSelf: $showNext),
isActive: $showNext) { EmptyView() }
Button("Show Next") {
showNext = true
}
}
}
...
struct NextView: View {
@Binding var showSelf: Bool
var body: some View {
Text("Next")
.navigationTitle("Next")
Button("Dismiss") {
showSelf = false
}
.padding(30)
}
}
点击Show Next
时, NextView
会按预期显示。
但是当点击Dismiss
时,没有任何反应。
原来showSelf
在设置为false
之前就已经是false
了。 因此,将绑定传递给NextView
似乎出了点问题。
有什么问题吗?
该问题是由NavigationStack
引起的。 当我用NavigationView
替换它时,它按预期工作。
当嵌入NavigationStack
时, NavigationLink
的isActive
绑定似乎不起作用(或不受支持)。
当您没有正确地为 NavigationView 提供详细视图时,有时会发生这种错误,例如
NavigationView {
MainView()
DetailView()
}
它试图在层次结构的更下方使用另一个视图,这可能导致 isActive 之类的东西中断。 在您的情况下, NextView
中可能存在一个错误,您有 2 个视图但没有容器,请尝试将其更改为:
struct NextView: View {
@Binding var showSelf: Bool
var body: some View {
HStack {
Text("Next")
Button("Dismiss") {
showSelf = false
}
}
.navigationTitle("Next")
}
}
另一件非标准的事情是EmptyView
的使用。
您正在尝试混合 iOS >= 16 ( NavigationStack ) 和 iOS < 16 的代码(以前处理NavigationLink的方法)。 同样对于 dismiss 部分,它是 iOS < 15。
这是 iOS 16 的代码:
import SwiftUI
struct ContentView: View {
var body: some View {
NavigationStack {
VStack {
NavigationLink {
NextView()
} label: {
Text("Show next view")
}
}
}
}
}
struct NextView: View {
@Environment(\.dismiss) private var dismiss
var body: some View {
VStack {
Text("You are in the next view")
Button("Dismiss", action: dismiss.callAsFunction)
}
.navigationTitle("Next")
}
}
我使用了最简单的NavigationLink结构。 一个更复杂的将与.navigationDestination结合使用。 我发现的最好的例子在这里:
如果您想更深入地了解堆栈的非常奇怪的行为,您可以在这里查看我的帖子: 在与新的导航堆栈组合时发现@State 的奇怪行为 - 这是一个错误还是我做错了?
如果您需要为 iOS < 16 生成代码,则应将NavigationStack替换为NavigationView并从那里开始工作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.