来自 @ObservableObject 的 @Binding 在 Init() 期间创建

问题描述 投票:0回答:1

如何绑定到初始化期间创建的

ObservableObject

我想确保将特定值捕获为

@Binding
/
@State
变量(因此它始终在视图中保持更新),但是在通过在 also 期间创建的对象进行绑定时遇到错误相同的初始化。例如:

RandomOptionsManager
是一个
ObservableObject
,它从文件加载选项列表:

class RandomOptionsManager: ObservableObject {
    
    @Published var listCount: Int = 0
    
    init() {
        // Real code would load the list from a file
        self.listCount = 150
    }
}

...然后

Randomizer
使用这些对象之一来生成结果。作为其代码的一部分,此类对可用选项的数量进行了计数,我试图从选项管理器中的
@Binding
var 中将其作为
@Published
获取:

class Randomizer: ObservableObject {
    
    @ObservedObject var optionsManager = RandomOptionsManager()
    @Binding var listCount: Int
    
    init() {
        self._listCount = $optionsManager.listCount
    }
}

但是,此代码会导致初始化错误:

在初始化所有存储的属性之前,在属性访问“$optionsManager”中使用“self”

避免此问题的正确配置是什么?

或者期望我真的应该放弃这种方法并将

RandomOptionsManager
作为
@EnvironmentObject
注入?这感觉好像损害了这里的模块化。

swift swiftui binding initialization swiftui-state
1个回答
0
投票

正如问题评论中所建议的,这可以通过避免

@Binding
@ObservedObject
(它们实际上用于视图,而不是像这样的其他类)并使用
[assign(to:)][1]
将 optionsManager 的
@Published var
重新发布为新的来解决随机发生器内的属性。

这只需要更改

Randomizer
的代码。
RandomOptionsManager
的代码与问题中的代码相同:

class Randomizer: ObservableObject {
    
    @Published var listCount: Int = 0
    private let optionsManager = RandomOptionsManager()
    
    init() {
        optionsManager.$listCount.assign(to: &self.$listCount)
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.