簡體   English   中英

如果我的 model object 的屬性是自定義 object 的數組,我如何讓用戶 Z9516DFB15F51C7EEDBBED4 到它?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM