Когда значение свойства изменяется в классе через @Published, некоторые из наблюдаемых объектов не обновляются? - PullRequest
0 голосов
/ 29 мая 2020

Это все коды.

класс SurveyQuestion

class SurveyQuestion: ObservableObject {
    @Published var text: String

    init() {
        print("Initialising now ...")
        self.text = "HELLO"
        changeText()
    }

    func changeText() {
        print("Changing Text Now from \(text).. ")

        if self.text == "HELLO"{
            self.text = "BYE"
        }
        else{
            self.text = "HELLO"
        }


        print("to \(self.text) \n")


    }
}

SubView.swift

struct SubView: View {

    @ObservedObject var someOtherClass = SurveyQuestion()

    var body: some View {
        Text("Text now is \(someOtherClass.text)")

    }
}

ContentView.swift

struct ContentView: View {

    @ObservedObject var someClass = SurveyQuestion()



    var body: some View {

        VStack{

            Button(action: {
                print("Changing Text Now !")
                self.someClass.changeText()
            }) {
                Text("Change Text ")
            }

            Text("Text now is \(someClass.text)")

            SubView()

        }
    }
}

Каждый раз, когда я нажимаю кнопку «changeText», он меняет текст в Text («Text now is (someClass.text)»), но не в Subview (). Все они должны быть обновлены одним и тем же изменением текста. Есть идеи, что здесь пошло не так?

Ответы [ 2 ]

0 голосов
/ 29 мая 2020

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

struct SubView: View {
    @ObservedObject var someOtherClass: SurveyQuestion // to be injected

    var body: some View {
        Text("Text now is \(someOtherClass.text)")

    }
}


struct ContentView: View {
    @ObservedObject var someClass = SurveyQuestion() // created

    var body: some View {

        VStack{

            Button(action: {
                print("Changing Text Now !")
                self.someClass.changeText()
            }) {
                Text("Change Text ")
            }

            Text("Text now is \(someClass.text)")

            SubView(someOtherClass: someClass) // << injected

        }
    }
}
0 голосов
/ 29 мая 2020

Ваши someClass и someOtherClass - два совершенно разных объекта. Изменение одного не влияет на другое. Если предполагалось, что это будет одноэлементная наблюдаемая, которая может влиять на разные представления одновременно, вам нужен объект environment .

...