如何使用通过类函数编辑环境对象?

问题描述 投票:0回答:1

我是快速编程的新手。我试图通过专门通过类函数来更改环境对象的值来尝试使用环境对象来更新视图。我希望在内容数据视图中有两个子视图,以查看在UserData环境对象中更改字符串时两个子视图是否一起更新。

但是,出现错误,提示'线程1:致命错误:未找到UserData类型的ObservableObject。 UserData的View.environmentObject(_ :)可能会丢失...'

在SceneDelagate.swift中,我注入了环境对象:

let userData = UserData()

window.rootViewController = UIHostingController(rootView:contentView.environmentObject(userData))

UserData.swift

final class UserData: ObservableObject {

    @Published var image: UIImage? = nil
    @Published var string  = "" 



}

StringGenerator.swift

class StringGenerator {

    @EnvironmentObject var userData: UserData


    func changeURL(){
        print("Changing string now from \(userData.string)")
        if self.userData.string == "HELLO"{
            self.userData.string = "BYE"

        }
        else{
            self.userData.string = "HELLO"
        }
        print("to \(userData.string)")
    }
}

SubView1.swift

struct SubView1: View {
    @EnvironmentObject var userData: UserData



    var body: some View {
        Text("\(userData.string)")

    }
}

SubView2.swift

struct SubView2: View {
    @EnvironmentObject var userData: UserData



    var body: some View {
        Text("\(userData.string)")

    }
}

ContentView.swift

struct ContentView: View {
    @EnvironmentObject var userData: UserData

    let stringGenerator = StringGenerator()

    var body: some View {

        VStack{

            Button(action: {
                print("Changing Text Now !")
                self.stringGenerator.changeURL()
                print("\(self.userData.string)")
            }) {
                Text("Change Text ")
            }


            SubView1()
            SubView2()


        }


    }
}

通常,我想知道如何通过类函数来更改环境对象。

我运行它时代码崩溃。这是什么问题?

ios swift swiftui observable environmentobject
1个回答
0
投票

这里是解决方法:

ContentView中的[1)

struct ContentView: View {
    @EnvironmentObject var userData: UserData

    let stringGenerator: StringGenerator   // declare-only

2在生成器中

class StringGenerator {

    var userData: UserData   // just member

SceneDelegate中的[3)

let userData = UserData()

// inject generator via constructor with same user data
let contentView = ContentView(stringGenerator: 
                              StringGenerator(userData: userData))

window.rootViewController = UIHostingController(rootView: 
                              contentView.environmentObject(userData))
© www.soinside.com 2019 - 2024. All rights reserved.