【问题标题】:Manipulating EnvironmentObject inside ObservedObject without getting entire view updated在 ObservedObject 中操作 EnvironmentObject 而不更新整个视图
【发布时间】:2020-12-05 16:11:02
【问题描述】:

使用包装器允许我们将 EnvironmentObject 向下传递到 ObservedObject。不错的方法..

但是如果你想在 ViewObject 中操作 userData 而不是每次都创建一个全新的 ViewObject 怎么办?

在我更改 EnvironmentObject 后,在我的应用程序中重新创建了整个视图,但我不知道如何避免这种情况。

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 swiftui-environment


    【解决方案1】:

    但是如果你想在 ViewObject 中操作 userData 而不是每次都创建一个全新的 ViewObject 怎么办?

    这是一个可能解决方案的演示 - 将 viewObject 设为 StateObject(这将通过视图刷新使其持久化)并将 userData 注入其中

    使用 Xcode 12.1 / iOS 14.1 测试

    class UserData: ObservableObject {
        @Published var UID = "1"
    }
    
    class ViewObject: ObservableObject {
        var userData: UserData?
        @Published var myCoolProperty = "Hello"
    }
    
    struct MyCoolView: View {
        @EnvironmentObject var userData: UserData
    
        var body: some View {
            MyCoolInternalView(self.userData)
        }
    }
    
    struct MyCoolInternalView: View {
        @StateObject private var viewObject = ViewObject()
    
        init(_ userData: UserData) {
            self.viewObject.userData = userData
        }
    
        var body: some View {
                Text("\(self.viewObject.myCoolProperty)")
        }
    }
    

    【讨论】:

    • 谢谢!但在我的版本中,ViewObject 是通过传递 userData.UID 来初始化的,因此我可以根据从网络或数据库中获取的数据构建视图。在你的中,我不能在 init 中使用 UserData 的属性,因为 ViewObject 是在没有参数的情况下初始化的,并且在创建它时 - userData 属性尚未设置。假设我将我的 init(id:) 的内容放入了一些 execute() 函数中。如何正确启动它以生成我的视图?文本().onAppear ?
    • 不确定我理解你的意思 - 你要求在 ViewObject 中操作 userData。不?如果 ViewObject 中没有 userData,那么 manipulate 是什么意思?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-17
    • 1970-01-01
    • 2022-08-03
    • 2020-12-21
    • 2020-10-22
    • 1970-01-01
    相关资源
    最近更新 更多