如何从类而不是视图更改@EnvironmentObject
Posted
技术标签:
【中文标题】如何从类而不是视图更改@EnvironmentObject【英文标题】:How to change @EnvironmentObject from class, and not a View 【发布时间】:2020-07-07 17:29:13 【问题描述】:我有一个带有两个子视图的 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"
【问题讨论】:
【参考方案1】:这里是更正的部分(你不需要 @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"
【讨论】:
Asperi,你能看看这个关于传递 EnvironmentObject 的问题吗? TIA***.com/questions/62824167/…以上是关于如何从类而不是视图更改@EnvironmentObject的主要内容,如果未能解决你的问题,请参考以下文章
我如何在另一个类而不是 ViewController 中实现.GMSMapViewDelegate
如何为模态更改此代码,以便它可以与类而不是href一起使用?