我在開始使用SwiftUI時遇到了麻煩。我想做的事情相當簡單,至少我以為是這樣的。我想做的是,ContentView期望得到一個人的名字和姓氏。按鈕 "添加到串列 "將該人添加到一個串列中,第二個按鈕在第二個視圖中顯示所有添加的人的串列。我讀了關于屬性包裝器的文章,但我不能讓它發揮作用。我是否需要將struct Person改為class,以便使用@ObservedObject來初始化@StateObject var listOfPersons = [Person]()或者是否有一個更簡單的類似Swift的方法來將串列傳遞給我的PersonList View?
我的專案代碼:
ContentView.swift
struct ContentView。View {
@State var firstName: String = ""/span>
@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"/span>)
.font(.title)
TextField("Fist name:"/span>, text: $firstName)
.padding()
TextField("last name:", text: $firstName)
.padding()
HStack(spacing: 40) {
Button("Add to list"/span>) {
listOfPersons.append(Person(firstName: 名, lastName: 姓))
}
.padding()
NavigationLink(目的地。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[/span]>
var lastName: String
}
PersonRow.swift
import SwiftUI
struct PersonRow: View {
var person: Person[/span].
var body: some View {
Text("(person.firstName), (person.lastName)")
}
}
uj5u.com熱心網友回復:
你的代碼有幾個問題,但你的方向是正確的。首先,將@StateObject var listOfPersons = [Person]()改為:
@State var listOfPersons = [Person]()
@StateObject是針對ObservableObject類的一個實體。@State是你應該使用的Person結構的簡單陣列。
那么,在你當前的代碼中,你只是實體化了一個普通的PersonList,沒有任何引數。你想要傳入listOfPersons.
/// here!
NavigationLink(目的地。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幾乎不需要有默認值,因為它總是被傳入。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/331998.html
標籤:
