首页 > 解决方案 > Swiftui - 如何使用环境对象作为参数初始化observedObject?

问题描述

我不确定这是否是我们生活的这个勇敢的新 SwiftUI 世界中的反模式,但基本上我有一个 @EnvironmentObject ,其中保存了一些我的视图可以调用的基本用户信息。

我还有一个@ObservedObject,它拥有该视图所需的一些数据。

当视图出现时,我想使用该@EnvironmentObject 来初始化@ObservedObject:

struct MyCoolView: View { 

    @EnvironmentObject userData: UserData
    @ObservedObject var viewObject: ViewObject = ViewObject(id: self.userData.UID)  

    var body: some View { 
            Text("\(self.viewObject.myCoolProperty)")
    } 
}

不幸的是,在初始化之前我不能在环境变量上调用 self :

“不能在属性初始化程序中使用实例成员 'userData';属性初始化程序在 'self' 可用之前运行。”

我可以看到一些可能的前进路线,但它们都感觉像黑客。我应该如何处理这个?

标签: iosswiftswiftuixcode11

解决方案


这是方法(最简单的IMO):

struct MyCoolView: View {
    @EnvironmentObject var userData: UserData

    var body: some View {
        MyCoolInternalView(ViewObject(id: self.userData.UID))
    }
}

struct MyCoolInternalView: View {
    @EnvironmentObject var userData: UserData
    @ObservedObject var viewObject: ViewObject

    init(_ viewObject: ViewObject) {
        self.viewObject = viewObject
    }

    var body: some View {
            Text("\(self.viewObject.myCoolProperty)")
    }
}

推荐阅读