Я столкнулся с проблемой, когда представление не обновляется автоматически с помощью объекта @Observable.
struct Person: Identifiable {
var id: Int
var name: String
init(id: Int, name: String){
self.id = id
self.name = name
}
}
class People: ObservableObject {
@Published var people: [Person]
@Published var kitchens: [Kitchen]
init(){
self.people = [
Person(id: 1, name:"Javier"),
Person(id: 2, name:"Juan"),
Person(id: 3, name:"Pedro")]
}
}
struct ContentView: View {
@ObservedObject var mypeople: People
var body: some View {
VStack{
ForEach(mypeople.people){ person in
Text("\(person.name)")
}
Button(action: {
self.mypeople.people.append(Person(id: 7, name: "New person"))
}) {
Text("Add/Change name")
}
}.onAppear {
self.mypeople.people.append(Person(id: 7, name: "New person"))
}
}
}
Итак, что я хочу сделать, так это добавить нового человека в onAppear вместо добавления нового человека нажатием кнопки. Короче говоря, в массиве people уже есть три человека, и мне нужно добавить четвертого сразу после перехода на это представление.
Странно то, что человек добавляется, если это представление, если это корневое представление, однако оно не работает, когда это представление отправляется с помощью навигационной ссылки. Во втором случае новый человек добавляется и удаляется сразу, сохраняя количество людей в массиве до трех.
Однако нового человека легко добавить одним нажатием кнопки. Я застрял здесь на несколько часов. Любая помощь будет более чем оценена! Заранее спасибо!
ИЗМЕНИТЬ
Я немного отлаживал, чтобы выяснить проблему. Итак, новый человек автоматически добавляется в onAppear в следующих сценариях:
1) Если ContentView является корневым представлением приложения. 2) Если ContentView выталкивается из самого первого представления в иерархии родительского представления. Означает, что есть подвиды ContentView. Ссылка навигации из вложенных представлений создает эту проблему, однако ссылка навигации непосредственно из ContentView успешно добавляет человека.
А для создания навигационной ссылки я использовал:
NavigationLink(destination: ContentView()) {
Text("View All")
}