Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/77.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
Swiftui 如何从类而不是视图更改@EnvironmentObject_Swiftui_Environmentobject - Fatal编程技术网

Swiftui 如何从类而不是视图更改@EnvironmentObject

Swiftui 如何从类而不是视图更改@EnvironmentObject,swiftui,environmentobject,Swiftui,Environmentobject,我有一个选项卡视图,它有两个子视图——PageOneView和PageTwoView。我还有一个@EnvironmentObject数据在SceneDelegate中初始化。PageOneView和PageTwoView中的每一个都有一个嵌套的子级。对于PageTwoView,嵌套的子视图也是一个视图,在其中我可以访问和修改@EnvironmentObject,并且所有顶级视图(PageOneView和PageTwoView)都反映了更改。但是对于PageOneView,嵌套的子对象是一个类,而

我有一个选项卡视图,它有两个子视图——PageOneView和PageTwoView。我还有一个@EnvironmentObject数据在SceneDelegate中初始化。PageOneView和PageTwoView中的每一个都有一个嵌套的子级。对于PageTwoView,嵌套的子视图也是一个视图,在其中我可以访问和修改@EnvironmentObject,并且所有顶级视图(PageOneView和PageTwoView)都反映了更改。但是对于PageOneView,嵌套的子对象是一个类,而不是一个视图,当我试图在PageOneView的子对象中修改它时,我得到一个错误:线程1:致命错误:找不到类型为Data的ObservableObject。数据的View.environmentObject(:)可能作为此视图的祖先丢失。有没有办法从嵌套子对象中更改@EnvironmentObject,该嵌套子对象不是视图,而是类

struct AppView: View {
        
        @EnvironmentObject var data: Data
        
        var body: some View {
            TabView {
                PageOneView().environmentObject(data)
                    .tabItem {
                        Text("PageOne")
                    }
    
                PageTwoView().environmentObject(data)
                    .tabItem {
                        Text("PageTwo")
                    }
                
                
            }
        }
    }

struct PageTwoView: View {
    
    @EnvironmentObject var data: Data
    
    var body: some View {
        VStack {
            Text("Data: \(data.Name)")
            ChildView()//.environmentObject(data)
        }
    }
}

struct ChildView: View {
    
    @EnvironmentObject var data: Data
    
    var body: some View {
        VStack {
            Text("Data: \(data.Name)")
        
            Button(action: {
            self.updateData()
            }) {
                Text("Update Data")
            }
        
        }
    }
    
    func updateData() 
    {
        self.data.Name = "Updated Name"
        
    }
}

struct PageOneView: View {
    
    @EnvironmentObject var data: Data
    
    var body: some View {
        
        VStack {
            Text("Data: \(data.Name)")
        
            Button(action: {
            self.updateData()
            }) {
                Text("Update Data")
            }
        
        }
    }
    
    func updateData()
    {
        var child = Child()
        child.updateData()
        
    }
    
}

class Child: NSObject{

     @EnvironmentObject var data: Data
    
    func updateData()
    {
        data.Name = "Updated Name Again"
    }
}
这里是更正的部分(您不需要类中的
@EnvironmentObject
包装器,它是为查看而设计的,您的
数据
本身就是一个类,所以您可以通过引用将其实例传递给您的
子类

这里是更正的部分(您不需要类中的
@EnvironmentObject
包装器,它是为查看而设计的,您的
数据
本身就是一个类,所以您可以通过引用将其实例传递给您的
子类


Asperi,你能看看这个关于传递EnvironmentObject的问题吗?TIA Asperi,你能看看这个关于传递EnvironmentObject的问题吗?短暂性脑缺血发作
    func updateData()
    {
        var child = Child(data: self.data)
        child.updateData()
        
    }
    
}

class Child: NSObject{

    let data: Data

    init(data: Data) {
      self.data = data
    }
    
    func updateData()
    {
        data.Name = "Updated Name Again"
    }
}