Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何使用类函数编辑环境对象?_Ios_Swift_Swiftui_Observable_Environmentobject - Fatal编程技术网

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

Ios 如何使用类函数编辑环境对象?,ios,swift,swiftui,observable,environmentobject,Ios,Swift,Swiftui,Observable,Environmentobject,我是swift编程新手。我试图通过一个类函数来改变环境对象的值,从而使用环境对象来更新视图。 contentview中有两个子视图,因为我希望看到当UserData环境对象中的字符串更改时,这两个子视图是否一起更新 但是,有一个错误是“线程1:致命错误:未找到UserData类型的ObservieObject”。UserData的View.environmentObject(:)可能丢失…' 在SceneDelagate.swift中,我注入了环境对象: let userData = UserD

我是swift编程新手。我试图通过一个类函数来改变环境对象的值,从而使用环境对象来更新视图。 contentview中有两个子视图,因为我希望看到当UserData环境对象中的字符串更改时,这两个子视图是否一起更新

但是,有一个错误是“线程1:致命错误:未找到UserData类型的ObservieObject”。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  = "" 



}
斯威夫特

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)")
    }
}
子视图1.swift

struct SubView1: View {
    @EnvironmentObject var userData: UserData



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

    }
}
子视图2.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()


        }


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

代码在我运行时崩溃。这里有什么问题?

这里有一个解决方案:

1) 在ContentView中

struct ContentView: View {
    @EnvironmentObject var userData: UserData

    let stringGenerator: StringGenerator   // declare-only
2) 发电机内

class StringGenerator {

    var userData: UserData   // just member
    init(userData: UserData) {
      self.userData = userData
    }
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))

stringGenerator
不继承环境,因为它不是视图层次结构的一部分。此外,这里没有类函数。您可以显式地将
userData
传递给
changeURL
您可以发布一些代码吗?这不会编译,出现错误:“类'StringGenerator'没有初始值设定项”,并且“'StringGenerator'无法构造,因为它没有可访问的初始值设定项”