Swiftui-如何使用环境对象作为参数来初始化observedObject?

时间:2019-12-17 03:26:31

标签: ios swift swiftui xcode11

我不确定在我们这个勇敢的新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)")
    } 
}

不幸的是,直到初始化后,我才能对环境变量进行自我调用:

  

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

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

2 个答案:

答案 0 :(得分:1)

这是方法(最简单的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)")
    }
}

答案 1 :(得分:0)

这是一种简单的方法:

struct MyCoolView: View {
    @EnvironmentObject var userData: UserData

    var body: some View {
        Observe(obj: ViewObject(id: userData.UID)) { viewObject in
             Text("\(viewObject.myCoolProperty)")
        }
    }
}

使用此帮助程序可以使其工作:

struct Observe<T: ObservableObject, V: View>: View {
    @ObservedObject var obj: T
    let content: (T) -> V
    var body: some View { content(obj) }
}