![](/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.