![](/img/trans.png)
[英]How do I encode/decode a custom object that has an array of custom objects?
[英]If a property of my model object is an array of a custom object, how do I let users append objects to it?
我正在制作一個應用程序,用戶可以在其中創建組,並在這些組中填充人員。 組顯示在列表中並鏈接到 GroupViews,其中包含該特定組的人員列表。
組的列表和創建按預期工作; 用戶可以創建組並單擊任何組將用戶帶到該特定組自己的視圖。
人的列表和創建不起作用; 當用戶嘗試將 append 一個人添加到人員列表時,它位於 AddPersonView 和 GroupView 之間,並且不會顯示在列表中。
以下是我目前對解決方案的嘗試:
型號.swift
import Foundation
struct Group: Identifiable {
var id: UUID
var name: String
var people: [Person]
init(name: String) {
self.id = UUID()
self.name = name
self.people = [Person]()
}
}
struct Person: Identifiable {
var id: UUID
var firstName: String
var lastName: String
}
模型視圖.swift
import Foundation
class GroupList: ObservableObject {
@Published var groups = [Group]()
}
ContentView.swift
import SwiftUI
struct ContentView: View {
@ObservedObject var groupList: GroupList
@State private var showingAddGroupView = false
var body: some View {
NavigationView {
List(groupList.groups) { group in
NavigationLink(destination: GroupView(group: group.people)) {
Text(group.name)
}
}
.navigationBarItems(trailing:
Button(action: {
self.showingAddGroupView.toggle()
}) {
Text("Add group")
})
}
.sheet(isPresented: $showingAddGroupView) {
AddGroupView(groupList: self.groupList)
}
}
}
添加GroupView.swift
import SwiftUI
struct AddGroupView: View {
@Environment(\.presentationMode) var presentationMode
@ObservedObject var groupList: GroupList
@State private var name = ""
var body: some View {
VStack {
TextField("Name", text: self.$name)
Button(action: {
self.groupList.groups.append(Group(name: self.name))
self.presentationMode.wrappedValue.dismiss()
}) {
Text("OK")
}
}
}
}
GroupView.swift
import SwiftUI
struct GroupView: View {
var group: [Person]
@State private var showingAddPersonView = false
var body: some View {
NavigationView {
VStack {
List(group) { person in
NavigationLink(destination: Text(person.firstName)) {
Text("\(person.firstName) \(person.lastName)")
}
}
.sheet(isPresented: $showingAddPersonView) {
AddPersonView(group: self.group)
}
}
.navigationBarItems(trailing:
Button(action: {
self.showingAddPersonView.toggle()
}) {
Text("Add person")
})
}
}
}
AddPersonView.swift
import SwiftUI
struct AddPersonView: View {
@Environment(\.presentationMode) var presentationMode
@State var group: [Person]
@State private var firstName = ""
@State private var lastName = ""
var body: some View {
VStack {
TextField("First name", text: self.$firstName)
TextField("Last name", text: self.$lastName)
Button(action: {
self.group.append(Person(id: UUID(), firstName: self.firstName, lastName: self.lastName))
self.presentationMode.wrappedValue.dismiss()
}) {
Text("OK")
}
}
}
}
問題出在 GroupView 中,這條線
var group: [Person]
當您調用 AddPersonView 時,您正在發送數組的副本,並且視圖將一個人附加到該副本,然后當視圖關閉時它會丟失。
你必須傳遞一些共享的東西。 可能這都應該在ObservableObject
中而不是本地視圖變量中。
傳遞 GroupList object 或綁定到其內部
看一下這個:
問題正是婁所說的 - 結構將被復制。 您必須更改並處理可觀察的 object - 而不是副本。
import SwiftUI
import Foundation
struct Group: Identifiable {
var id: UUID
var name: String
var people: [Person]
init(name: String) {
self.id = UUID()
self.name = name
self.people = [Person]()
}
}
struct Person: Identifiable {
var id: UUID
var firstName: String
var lastName: String
}
class GroupList: ObservableObject {
@Published var groups = [Group]()
func getGroupBy(id: UUID) -> Group? {
let result = groups.filter { $0.id == id }
if result.count == 1 {
return result[0]
}
return nil
}
func getGroupIndex(id: UUID) -> Int? {
return groups.firstIndex { $0.id == id }
}
}
struct ContentView: View {
@EnvironmentObject var groupList: GroupList
@State private var showingAddGroupView = false
var body: some View {
NavigationView {
List(self.groupList.groups) { group in
NavigationLink(destination: GroupView(group: group).environmentObject(self.groupList)) {
Text(group.name)
}
}
.navigationBarItems(trailing:
Button(action: {
self.showingAddGroupView.toggle()
}) {
Text("Add group")
})
}
.sheet(isPresented: $showingAddGroupView) {
AddGroupView().environmentObject(self.groupList)
}
}
}
struct AddGroupView: View {
@Environment(\.presentationMode) var presentationMode
@EnvironmentObject var groupList: GroupList
@State private var name = ""
var body: some View {
VStack {
TextField("Name", text: self.$name)
Button(action: {
self.groupList.groups.append(Group(name: self.name))
self.presentationMode.wrappedValue.dismiss()
}) {
Text("OK")
}
}
}
}
struct GroupView: View {
@EnvironmentObject var groupList: GroupList
var group: Group
@State private var showingAddPersonView = false
var body: some View {
NavigationView {
VStack {
List(self.group.people) { person in
NavigationLink(destination: Text(person.firstName)) {
Text("\(person.firstName) \(person.lastName)")
}
}
.sheet(isPresented: $showingAddPersonView) {
AddPersonView(group: self.group).environmentObject(self.groupList)
}
}
.navigationBarItems(trailing:
Button(action: {
self.showingAddPersonView.toggle()
}) {
Text("Add person")
})
}
}
}
struct AddPersonView: View {
@Environment(\.presentationMode) var presentationMode
@EnvironmentObject var groupList : GroupList
@State var group: Group
@State private var firstName = ""
@State private var lastName = ""
var body: some View {
VStack {
TextField("First name", text: self.$firstName)
TextField("Last name", text: self.$lastName)
Button(action: {
if let index = self.groupList.getGroupIndex(id: self.group.id) {
self.groupList.groups[index].people.append(Person(id: UUID(), firstName: self.firstName, lastName: self.lastName))
self.group = self.groupList.groups[index]
}
self.presentationMode.wrappedValue.dismiss()
}) {
Text("OK")
}
}
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView().environmentObject(GroupList())
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.