如何传递一个对象给新的SwiftUI视图



我在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类的实例。@StatePerson结构体的简单数组。

那么,在您当前的代码中,您只是实例化了一个没有任何参数的普通PersonList。你想传入listOfPersons.

/// here!
NavigationLink(destination: PersonList(listOfPersons: $listOfPersons)) {
Text("Show list")
}

$符号从listOfPersons中获得底层的Binding<[Person]>,这意味着在PersonListlistOfPersons中所做的任何更改都会反射回ContentViewlistOfPersons

最后,在PersonList中,将@Binding var listOfPersons = [Person]()更改为
struct PersonList: View {
@Binding var listOfPersons: [Person]
...
}

@Binding几乎不需要默认值,因为它总是传入的。

最新更新