如何从 class 而不是视图更改 @EnvironmentObject
How to change @EnvironmentObject from class, and not a View
我有一个带有两个子视图的 TabView - PageOneView 和 PageTwoView。我还有一个在 SceneDelegate 中初始化的 @EnvironmentObject Data。对于每个 PageOneView 和 PageTwoView,我还有一个嵌套的子视图。对于 PageTwoView,嵌套的子视图也是一个视图,在其中我可以访问和修改@EnvironmentObject,并且所有顶级视图(PageOneView 和 PageTwoView)都反映了更改。但是对于 PageOneView,嵌套的子项是 class,而不是视图,当我尝试在 PageOneView 的子项中修改它时,出现错误:线程 1:致命错误:未找到数据类型的 ObservableObject。作为此视图的祖先,Data 的 View.environmentObject(_:) 可能缺失。有没有办法从不是视图而是 class 的嵌套子项中更改 @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"
}
}
这是更正的部分(您不需要 class 中的 @EnvironmentObject
包装器,它是为视图设计的,您的 Data
本身就是 class,所以您可以通过引用您的 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"
}
}
我有一个带有两个子视图的 TabView - PageOneView 和 PageTwoView。我还有一个在 SceneDelegate 中初始化的 @EnvironmentObject Data。对于每个 PageOneView 和 PageTwoView,我还有一个嵌套的子视图。对于 PageTwoView,嵌套的子视图也是一个视图,在其中我可以访问和修改@EnvironmentObject,并且所有顶级视图(PageOneView 和 PageTwoView)都反映了更改。但是对于 PageOneView,嵌套的子项是 class,而不是视图,当我尝试在 PageOneView 的子项中修改它时,出现错误:线程 1:致命错误:未找到数据类型的 ObservableObject。作为此视图的祖先,Data 的 View.environmentObject(_:) 可能缺失。有没有办法从不是视图而是 class 的嵌套子项中更改 @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"
}
}
这是更正的部分(您不需要 class 中的 @EnvironmentObject
包装器,它是为视图设计的,您的 Data
本身就是 class,所以您可以通过引用您的 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"
}
}