我的目標是擁有一個結構陣列,當點擊單個專案時,會進行更改并將其傳遞給父視圖,但不會自動關閉我的子視圖。我真的不確定為什么子視圖會自動關閉以及如何防止它。這是我的 ContentView 代碼
import SwiftUI
struct Person: Hashable {
var name: String = ""
}
struct ContentView: View {
@State private var patients: [Person]
init() {
var temp: [Person] = []
for index in 0 ..< 3 {
temp.append(Person(name: "\(index)"))
}
patients = temp
}
var body: some View {
NavigationView {
VStack(spacing: 40) {
ForEach($patients, id:\.self) { $patient in
NavigationLink("\(patient.name)") {
ChangeNameView(patient: $patient)
}
}
}
}
}
}
struct ChangeNameView: View {
@Binding var patient: Person
var body: some View {
Button {
patient.name = "New Name"
} label: {
Text("Set New Name")
}
}
}
點擊名稱將按預期顯示子視圖。然后點擊按鈕更改名稱會這樣做,但隨后會立即關閉視圖。
uj5u.com熱心網友回復:
問題來自這樣一個事實,Person即Hashable(僅使用該name屬性)并且對于您的ForEach,您正在\.self使用id.
SwiftUIForEach使用該id:引數來跟蹤串列中的哪個元素。因為您正在使用\.self然后更改該name元素的ChangeNameView,它不再看起來像同一個元素,并且 SwiftUI 從層次結構中洗掉了子視圖(因為舊視圖不再存在于串列中)。
一種解決方案是使用真正Identifiable的元素,其中id是唯一的并且在您更改時不會更新name:
struct Person: Hashable, Identifiable { //<-- Here
var id = UUID() //<-- Here
var name: String = ""
}
struct ContentView: View {
@State private var patients: [Person]
init() {
var temp: [Person] = []
for index in 0 ..< 3 {
temp.append(Person(name: "\(index)"))
}
patients = temp
}
var body: some View {
NavigationView {
VStack(spacing: 40) {
ForEach($patients) { $patient in //<-- Here -- when the items are Identifiable, it's essentially like saying `id: \.id`
NavigationLink("\(patient.name)") {
ChangeNameView(patient: $patient)
}
}
}
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/438916.html
