1

我有一个带有两个子视图的 TabView - PageOneView 和 PageTwoView。我还在 SceneDelegate 中初始化了一个 @EnvironmentObject 数据。对于 PageOneView 和 PageTwoView,我还有一个嵌套子级。对于 PageTwoView,嵌套的子视图也是一个视图,在其中我可以访问和修改 @EnvironmentObject,并且所有顶级视图(PageOneView 和 PageTwoView)都反映了更改。但是对于 PageOneView 嵌套的子级是一个类,而不是一个视图,当我尝试在 PageOneView 的子级中修改它时,我得到一个错误:线程 1:致命错误:没有找到数据类型的 ObservableObject。作为此视图的祖先,Data 的 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"
    }
}
4

1 回答 1

0

这是更正的部分(您不需要@EnvironmentObject类中的包装器,它是为 View 设计的,您Data本身就是一个类,因此您可以通过引用来传递它的实例Child

    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"
    }
}
于 2020-07-07T17:39:43.620 回答