我在SwiftUI入门时遇到了麻烦。我想做的事情很简单,至少我是这么认为的。我想做的是ContentView需要一个人的姓和名。按钮"添加到列表"将人员添加到列表中,第二个按钮在第二个视图中显示所有已添加人员的列表。我读了关于属性包装的书,但我不能让它工作。我是否需要将struct Person
更改为class
,以便使用@ObservedObject
初始化@StateObject var listOfPersons = [Person]()
,或者是否有更简单的Swift方式将列表传递给我的PersonList View
?我的项目代码:
ContentView.swift
struct ContentView: View {
@State var firstName: String = ""
@State var lastName: String = ""
@StateObject var listOfPersons = [Person]()
var body: some View {
NavigationView {
ZStack (alignment: .top){
Color(.orange).opacity(0.2).edgesIgnoringSafeArea(.all)
VStack {
Text("Hello stranger")
.font(.title)
TextField("Fist name:", text: $firstName)
.padding()
TextField("Last name:", text: $firstName)
.padding()
HStack(spacing: 40) {
Button("Add to list") {
listOfPersons.append(Person(firstName: firstName, lastName: lastName))
}
.padding()
NavigationLink(destination: PersonList()) {
Text("Show list")
}
...
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
PersonList.swift
import SwiftUI
struct PersonList: View {
@Binding var listOfPersons = [Person]()
var body: some View {
Color(.orange).opacity(0.2).edgesIgnoringSafeArea(.all)
List(listOfPersons) { person in
PersonRow(person: person) }
}
}
struct PersonList_Previews: PreviewProvider {
static var previews: some View {
PersonList()
}
}
Person.swift
import Foundation
struct Person {
var firstName: String
var lastName: String
}
PersonRow.swift
import SwiftUI
struct PersonRow: View {
var person: Person
var body: some View {
Text("(person.firstName), (person.lastName)")
}
}
您的代码有几个问题,但是您在正确的轨道上。首先,将@StateObject var listOfPersons = [Person]()
替换为:
@State var listOfPersons = [Person]()
@StateObject
表示ObservableObject
类的实例。@State
是Person
结构体的简单数组。
那么,在您当前的代码中,您只是实例化了一个没有任何参数的普通PersonList
。你想传入listOfPersons
.
/// here!
NavigationLink(destination: PersonList(listOfPersons: $listOfPersons)) {
Text("Show list")
}
$
符号从listOfPersons
中获得底层的Binding<[Person]>
,这意味着在PersonList
的listOfPersons
中所做的任何更改都会反射回ContentView
的listOfPersons
。
PersonList
中,将@Binding var listOfPersons = [Person]()
更改为
struct PersonList: View {
@Binding var listOfPersons: [Person]
...
}
@Binding
几乎不需要默认值,因为它总是传入的。