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