【问题标题】:How to pass a value from an EnvironmentObject to a class instance in SwiftUI?如何将值从 EnvironmentObject 传递给 SwiftUI 中的类实例?
【发布时间】:2020-03-19 10:37:40
【问题描述】:

我正在尝试将名为 userSettings 的 EnvironmentObject 中的值分配给名为 categoryData 的类实例,尝试将值分配给此处的类时出现错误 ObserverCategory(userID: self.userSettings.id)

错误说: Cannot use instance member 'userSettings' within property initializer; property initializers run before 'self' is available

这是我的代码:

这是我的环境对象类:

//user settings
final class UserSettings: ObservableObject {
    @Published var name : String = String()
    @Published var id : String = "12345"
}

接下来是我试图为其赋值的代码:

//user settings
@EnvironmentObject var userSettings: UserSettings

//instance of observer object
@ObservedObject var categoryData = ObserverCategory(userID: userSettings.id)

class ObserverCategory : ObservableObject {

    let userID : String

    init(userID: String) {

        let db = Firestore.firestore().collection("users/\(userID)/categories") //

        db.addSnapshotListener { (snap, err) in
            if err != nil {
                print((err?.localizedDescription)!)
                return
            }

            for doc in snap!.documentChanges {

                //code 

            }
        }
    }
}

谁能指导我解决这个错误?

谢谢

【问题讨论】:

    标签: swift swiftui swift5.1


    【解决方案1】:

    因为@EnvironmentObject@ObservedObject 正在同时初始化。所以你不能用其中一个作为另一个的论据。

    您可以让ObservedObject 更懒惰。因此,当它可用时,您可以将其与EnvironmentObject 关联。例如:

    struct CategoryView: View {
    
        //instance of observer object
        @ObservedObject var categoryData: ObserverCategory
    
        var body: some View { ,,, }
    }
    

    然后像这样传递它:

    struct ContentView: View {
    
        //user settings
        @EnvironmentObject var userSettings: UserSettings
    
        var body: some View {
            CategoryView(categoryData: ObserverCategory(userID: userSettings.id))
        }
    }
    

    【讨论】:

    • 嗨@Mojtaba Hosseini,谢谢你的回答,它完全有道理,而且效果很好。我正在学习,这对我帮助很大,感谢您的帮助!
    猜你喜欢
    • 2020-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-05
    • 1970-01-01
    • 2020-07-31
    相关资源
    最近更新 更多