【问题标题】:Swiftui - How do I initialize an observedObject using an environmentobject as a parameter?Swiftui - 如何使用环境对象作为参数初始化observedObject?
【发布时间】:2020-04-09 13:00:20
【问题描述】:

我不确定这是否是我们生活的这个勇敢的新 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' 可用之前运行。”

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

【问题讨论】:

  • 也许您可以尝试在结构中添加自定义init
  • 我试过了,得到了一个有点奇怪的错误:Property wrappers are not yet supported on local properties 基本上它说我不能在 init 方法中创建一个@ObservedObject。

标签: ios swift swiftui xcode11


【解决方案1】:

这是一个简单的方法:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 这是完美的。 MyCoolView 实际上是我声明 ObservedObject 的“主”视图的子视图。谢谢!
    • 但是如果你想在 ViewObject 中操作 userData 而不是每次都创建一个全新的 ViewObject 怎么办?
    猜你喜欢
    • 2020-11-26
    • 2023-01-21
    • 2021-09-30
    • 1970-01-01
    • 2020-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-27
    相关资源
    最近更新 更多