Ios 环境对象内的SwiftUI可观察对象不更新视图

Ios 环境对象内的SwiftUI可观察对象不更新视图,ios,swift,swiftui,Ios,Swift,Swiftui,我最近遇到了一个问题,我没有找到解决它的方法。 如果我将一个可观察对象放置在环境对象中,当变量发生变化时,我的视图不会更新。 这是我的设置: inside SceneDelegate I使用environmentObject标记父视图: let parent = ParentView().environmentObject(Data()) 这是环境对象: class Data: ObservableObject { enum Page { case pageOne

我最近遇到了一个问题,我没有找到解决它的方法。 如果我将一个可观察对象放置在环境对象中,当变量发生变化时,我的视图不会更新。 这是我的设置:

inside SceneDelegate I使用environmentObject标记父视图:

 let parent = ParentView().environmentObject(Data())
这是环境对象:

class Data: ObservableObject {
    enum Page {
        case pageOne
    }
    var page: Page = .pageOne
    var person = Person()
}
现在,所有“我的视图”都链接到父视图:

struct ParentView: View {

     @EnvironmentObject var data: Data

     var body: some View {
         VStack {
            if self.data.page == .pageOne {
                PageOne()
            } else {
                Text("No pages")
            }
        }
    }
}
我有一门课(我称之为“人”):

当我点击文本时,该人的年龄在增加,但视图不会更新。 我想我甚至不明白为什么会这样。
我以为我知道它是如何工作的,但显然我不知道。

在你的例子中,
人不一定是一个类

您可以尝试以下方法:

class Data: ObservableObject {
    enum Page {
        case pageOne
    }

    var page: Page = .pageOne

    @Published var person = Person() {
        didSet {
            objectWillChange.send()
        }
    }
}

如果您需要
Person
来保持一个类,您可以将其
@发布

class Data: ObservableObject {
    enum Page {
        case pageOne
    }

    var page: Page = .pageOne
    @Published var person = Person() // <- add `@Published`
}
然后在
PageOne
视图中将
Person
用作
@ObservedObject

struct ContentView: View {
    @EnvironmentObject var data: Data

    var body: some View {
        VStack {
            if self.data.page == .pageOne {
                PageOne(person: data.person) // pass `person` object
            } else {
                Text("No pages")
            }
        }
    }
}

struct PageOne: View {
    @ObservedObject var person: Person // observe `person` directly

    var body: some View {
        Text("\(person.age)").onTapGesture {
            self.person.birthday()
        }
    }
}

这只是一个大项目的示例代码,所以我需要使用class@Kevin我用一个类的解决方案更新了我的答案。@Ahmadreza你是什么意思?我没有看到任何计数函数。@pawello2222,对不起,我指的是生日函数我修复了它,但创建了一个自定义初始值设定项函数来更新该值。@Ahmadreza您可以执行
self.person.age=35
。但我建议你提出一个新问题——我会尽力帮助你。
struct Person {
    var age = 30

    mutating func birthday() {
        self.age += 1
        print(age)
    }
}
class Data: ObservableObject {
    enum Page {
        case pageOne
    }

    var page: Page = .pageOne
    @Published var person = Person() // <- add `@Published`
}
class Person: ObservableObject {
    @Published var age = 30

    func birthday() {
        self.age += 1
        print(age)
    }
}
struct ContentView: View {
    @EnvironmentObject var data: Data

    var body: some View {
        VStack {
            if self.data.page == .pageOne {
                PageOne(person: data.person) // pass `person` object
            } else {
                Text("No pages")
            }
        }
    }
}

struct PageOne: View {
    @ObservedObject var person: Person // observe `person` directly

    var body: some View {
        Text("\(person.age)").onTapGesture {
            self.person.birthday()
        }
    }
}