Я пытаюсь лучше понять @EnvironmentObject, поэтому я написал пример кода ниже, чтобы воспроизвести проблему, с которой я сталкиваюсь
Это класс, в котором я объявляю массив, к которому нужно обращаться в нескольких местах, и который должен отображаться и обновлено в ContentView
class User: ObservableObject {
@Published var array = [String]()
func diplayName(name: String){
self.array.append(name)
}
}
Я хочу добавить свой массив в другой класс. Что-то вроде приведенного ниже кода
class myTests: ObservableObject {
@EnvironmentObject var user:User
func diplayMyName(name: String){
self.user.array.append(name)
}
}
Когда я вызываю функцию displayMyName в классе myTests, я получаю сообщение об ошибке, как показано ниже
Fatal error: No ObservableObject of type User found.
A View.environmentObject(_:) for User may be missing as an ancestor of this view.
Вот так выглядит мой contentView
struct ContentView: View {
@EnvironmentObject var user:User
var testing = myTests()
var body: some View {
VStack {
List(user.array, id: \.self){ x in
Text(x)
}
Button(action: {
self.user.diplayName(name: "Name1")
// self.testing.diplayMyName(name: "Name2")
}){
Text("Call Function")
}
}
}
}
Вот так я объявляю свой объект среды в делегате сцены.
let contentView = ContentView().environmentObject(User())
Я был бы очень признателен, если бы кто-нибудь помог мне понять, почему я получаю ошибку, когда добавляю опубликованный массив из класса myTests. Спасибо.
ОБНОВЛЕНИЕ
Чтобы обойти мою проблему, я сделал следующие корректировки, я возвратил массив в классе myTests
class myTests {
var ar = [String]()
func displayMyName() -> [String] {
ar.removeAll()
ar.append(contentsOf: ["Name2", "Name3"])
return ar
}
}
И добавил его в массив в ContentView
struct ContentView: View {
@EnvironmentObject var user : User
var testing = myTests()
var body: some View {
VStack {
List(user.array, id: \.self){ x in
Text(x)
}
Button(action: {
self.user.array.append(contentsOf: self.testing.displayMyName())
}){
Text("Call Function")
}
}
}
}