【问题标题】:SwiftUI Observable Object inside Environment Object does not update viewEnvironment Object 中的 SwiftUI Observable Object 不会更新视图
【发布时间】:2020-07-22 06:02:13
【问题描述】:

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

在 SceneDelegate 中,我使用 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")
            }
        }
    }
}

我有一个班级(我称之为“人”):

 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()
         }
     }
 }

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

【问题讨论】:

    标签: ios swift swiftui


    【解决方案1】:

    在您的情况下,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 视图中使用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()
            }
        }
    }
    

    【讨论】:

    • 这只是一个大项目的示例代码,所以我需要使用一个类
    • @Kevin 我用 class 的解决方案更新了我的答案。
    • @Ahmadreza 你是什么意思?我没有看到任何 count 函数。
    • @pawello2222,对不起,我的意思是生日功能。 & 我修复了它,但创建了一个自定义初始化函数来更新值。
    • @Ahmadreza 你可以做self.person.age = 35。但我建议您创建一个新问题 - 我会尽力帮助您。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-12
    • 1970-01-01
    • 2018-05-09
    • 2020-06-27
    • 2019-10-10
    • 1970-01-01
    相关资源
    最近更新 更多