Нет ObservableObject типа Пользователь не найден - PullRequest
0 голосов
/ 09 января 2020

Я пытаюсь лучше понять @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")
            }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...