我最近遇到了一个问题,但我找不到解决方法。 如果我将一个可观察对象放在一个环境对象中,我的 View 不会在变量发生变化时更新。 这是我的设置:
在 SceneDelegate 中,我使用 environmentObject 对父 View 进行 decalre:
let parent = ParentView().environmentObject(Data())
这是环境对象:
class Data: ObservableObject {
enum Page {
case pageOne
}
var page: Page = .pageOne
var person = Person()
}
现在我所有的 View 都链接到父 View :
struct ParentView: View {
@EnvironmentObject var data: Data
var body: some View {
VStack {
if self.data.page == .pageOne {
PageOne()
} else {
Text("No pages")
}
}
}
}
我有一个类(我称之为“人”):
import Foundation
import SwiftUI
import Combine
class Person: ObservableObject {
let objectWillChange = PassthroughSubject<Person,Never>()
@Published var age = 30 { didSet { objectWillChange.send(self)} }
func birthday() {
self.age += 1
print(age)
}
}
这就是我的问题所在:
struct PageOne: View {
@EnvironmentObject var data: Data
var body: some View {
Text("\(data.person.age)").onTapGesture {
self.data.person.birthday()
}
}
}
当我点击文本时,人的年龄在增加,但 View 没有更新。 我想我什至不明白为什么会这样。 我以为我知道它是如何工作的,但显然我不知道。
最佳答案
在您的情况下,Person
似乎不必是类。
你可以试试这个:
class Data: ObservableObject {
enum Page {
case pageOne
}
var page: Page = .pageOne
@Published var person = Person() {
didSet {
objectWillChange.send()
}
}
}
struct Person {
var age = 30
mutating func birthday() {
self.age += 1
print(age)
}
}
如果您需要 Person
保留一个类,您可以将其设为 @Published
:
class Data: ObservableObject {
enum Page {
case pageOne
}
var page: Page = .pageOne
@Published var person = Person() // <- add `@Published`
}
并从 Person
中删除不必要的 objectWillChange
代码:
class Person: ObservableObject {
@Published var age = 30
func birthday() {
self.age += 1
print(age)
}
}
然后在 PageOne
View 中使用 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()
}
}
}
关于ios - 环境对象内的 SwiftUI 可观察对象不更新 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63020783/