Swift Array .append () метод не работает в SwiftUI - PullRequest
1 голос
/ 07 марта 2020

Я изо всех сил пытаюсь сделать простое добавление в SwiftUI. Вот мой код:

// This is defined in my custom view
var newClass = Class()

// This is inside a List container (I hid the Button's content because it doesn't matter)
Button(action: {
    self.newClass.students.append(Student())
    print(self.newClass.students) // This prints an Array with only one Student() instance - the one defined in the struct's init
})

// These are the custom structs used
struct Class: Identifiable {
    var id = UUID()
    @State var name = ""
    @State var students: [Student] = [Student()] // Right here
}

struct Student: Identifiable {
    var id = UUID()
    @State var name: String = ""
}

Я думаю, это может быть как-то связано с новой вещью @Struct, но я новичок в разработке iOS (и Swift), поэтому я не уверен.

1 Ответ

1 голос
/ 07 марта 2020

Давайте немного изменим модель ...

struct Class: Identifiable {
    var id = UUID()
    var name = ""
    var students: [Student] = [Student()]
}

struct Student: Identifiable {
    var id = UUID()
    var name: String = ""
}

... и вместо использования @State в не предназначенном для этого месте (потому что он предназначен для просмотра внутри представления, а не для модели), давайте представить слой модели представления как

class ClassViewModel: ObservableObject {
    @Published var newClass = Class()
}

, и теперь мы можем объявить связанный вид, который ведет себя как ожидалось

struct ClassView: View {
    @ObservedObject var vm = ClassViewModel()

    var body: some View {
        Button("Add Student") {
            self.vm.newClass.students.append(Student())
            print(self.vm.newClass.students)
        }
    }
}

Вывод:

Test [4298: 344875 ] [Агент] Получено сообщение дисплея [Test.Student (id: D1410829-F039-4D15-8440-69DEF0D55A26, имя: ""), Test.Student (id: 50D45CC7-8144-49 CC -88BE-598C890F2D4D, имя : "")]

...