ios - 环境对象内的 SwiftUI 可观察对象不更新 View

标签 ios swift swiftui

我最近遇到了一个问题,但我找不到解决方法。 如果我将一个可观察对象放在一个环境对象中,我的 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/

相关文章:

swift - 等于或==在swiftui中抛出 "Ambiguous reference"错误

swiftui - 如何在 SwiftUI 中编辑图像和文本的对齐方式和间距?

ios - 当我导出我的 IOS PhoneGap 应用程序以进行临时分发时,如何使我的图标出现在我的 IOS PhoneGap 应用程序上?

ios - 如何根据地址在 Debug View Hierarchy 中查找 View ?

ios - 如何在没有SDK的情况下在iOS中集成Linkedin登录?

iphone - Xcode 7 : UITextview doesn't aligned properly for 3 different sizes iPhone screen

iphone - 处理 Storyboard 中 View Controller 之间的模态转场

swift - “ fatal error :在展开可选值时意外发现nil”是什么意思?

swift - UIDatePicker:选择当前日期(快速)

SwiftUI 在 NavigationLink 上滑动/拖动