Swiftui - 如何使用环境对象作为参数初始化观察对象? [英] Swiftui - How do I initialize an observedObject using an environmentobject as a parameter?

查看:22
本文介绍了Swiftui - 如何使用环境对象作为参数初始化观察对象?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I'm not sure if this is an antipattern in this brave new SwiftUI world we live in, but essentially I have an @EnvironmentObject with some basic user information saved in it that my views can call.

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

I also have an @ObservedObject that owns some data required for this view.

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

When the view appears, I want to use that @EnvironmentObject to initialize the @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 :

Unfortunately I can't call self on the environment variable until after initialization:

不能在属性初始值设定项中使用实例成员‘userData’;属性初始值设定项在‘self’可用之前运行."

"Cannot use instance member 'userData' within property initializer; property initializers run before 'self' is available."

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

I can see a few possible routes forward, but they all feel like hacks. How should I approach this?

推荐答案

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

Here is the approach (the simplest 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)")
    }
}

这篇关于Swiftui - 如何使用环境对象作为参数初始化观察对象?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆