我將 aPerson binding從第一個視圖傳遞到第二個視圖到第三個視圖,當我更新第三個視圖中的binding值時,它會彈回第二個視圖,我知道 SwiftUI 會更新依賴于狀態值的視圖,但是彈出當前視圖是預期的行為還是我做錯了什么?
struct Person: Identifiable {
let id = UUID()
var name: String
var numbers = [1, 2]
}
struct FirstView: View {
@State private var people = [Person(name: "Current Name")]
var body: some View {
NavigationView {
List($people) { $person in
NavigationLink(destination: SecondView(person: $person)) {
Text(person.name)
}
}
}
}
}
struct SecondView: View {
@Binding var person: Person
var body: some View {
Form {
NavigationLink(destination: ThirdView(person: $person)) {
Text("Update Info")
}
}
}
}
struct ThirdView: View {
@Binding var person: Person
var body: some View {
Form {
Button(action: {
person.numbers.append(3)
}) {
Text("Append a new number")
}
}
}
}

uj5u.com熱心網友回復:
SwiftUI 的作業原理是更新渲染的視圖以匹配您的狀態。
在這種情況下,您首先有一個串列,其中包含一個名為 的元素Current Name。使用 aNavigationLink選擇此項。
您更新了名稱,現在先前的元素不再存在,它已被一個名為的新元素替換New Name。
由于Current Name已不存在,因此也無法再選擇,視圖彈回串列。
為了能夠在不彈出的情況下編輯名稱,您需要確保串列中的專案相同,即使名稱已更改。您可以通過使用 aIdentifiable struct而不是 a來做到這一點String。
struct Person: Identifiable {
let id = UUID().uuidString
var name = "Current Name"
}
struct ParentView: View {
@State private var people = [Person()]
var body: some View {
NavigationView {
List($people) { $person in
NavigationLink(destination: ChildView(person: $person)) {
Text(person.name)
}
}
}
}
}
struct ChildView: View {
@Binding var person: Person
var body: some View {
Button(action: {
person.name = "New Name"
}) {
Text("Update Name")
}
}
}
uj5u.com熱心網友回復:
導航兩次時,您需要使用isDetailLink(false)or StackNavigationViewStyle,例如
struct FirstView: View {
@State private var people = [Person(name: "Current Name")]
var body: some View {
NavigationView {
List($people) { $person in
NavigationLink(destination: SecondView(person: $person)) {
Text(person.name)
}
.isDetailLink(false) // option 1
}
}
.navigationViewStyle(.stack) // option 2
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/405054.html
標籤:
