swift 将数组对象传递到要编辑的NavigationLink

vwkv1x7d  于 2023-01-19  发布在  Swift
关注(0)|答案(1)|浏览(155)

我现在有一个带有List的NavigationView,它使用ForEach循环来显示存储在数组中的一些对象的列表,这些对象附加到NavigationLink的数组中。当用户单击其中一个对象的链接时,他们可以编辑链接中对象的一些属性。然而,当他们试图编辑属性时,属性要么在键入时保持不变,要么在键入时保持不变。或者它把用户踢回NavigationView。我做错了什么?
子视图将对象作为绑定接收,子视图中的TextField也使用绑定来编辑属性。
我已经创建了一个精简版的一切,显示的问题,使它更快地阅读。

对象结构

struct Person: Hashable {
    var name: String
    var number: String
}

导航视图

struct ContentView: View {
    
    @State var people: [Person] = testPeople // this contains a few instances of Person
    
    var body: some View {
        VStack {
            NavigationView {
                
                List {
                    ForEach($people, id: \.self) { $person in
                        NavigationLink(destination: PersonView(person: $person)) {
                            Text(person.name)
                        }
                    }
                }
            }
        }
    }
}

导航链接

struct PersonView: View {
    
    @Binding var person: Person
    
    var body: some View {
        VStack {
            Text(person.name)
            TextField("number", text: $person.number) // this text field allows the user to edit the number property
        }
    }
}
8mmmxcuj

8mmmxcuj1#

当在PersonView上更新该编号时,它将更新ContentView中的Person,从而导致刷新视图。
可以通过在people.indices上执行ForEach来解决此问题,如下所示:

var body: some View {
    VStack {
        NavigationView {
            
            List {
                ForEach(people.indices, id: \.self) { index in
                    NavigationLink(destination: PersonView(person: $people[index])) {
                        Text(people[index].name)
                    }
                }
            }
        }
    }
}

我不知道为什么会这样,但就是这样!

相关问题