我找到了这个演示项目,它展示了如何在swiftU中使用干净、快捷,所以我尝试自己做这样的事情。我在使用Core数据时遇到了问题。作为干净、快捷的体系结构,只有一个源(在我的例子中是appState)可以将数据传递给视图。所以我创建了注入容器,它有interactor和appState。集装箱:
struct DIContainer: EnvironmentKey {
@ObservedObject var appState: AppState
let interactors: Interactors
init(appState: AppState, interactors: Interactors) {
self.appState = appState
self.interactors = interactors
}class AppState: ObservableObject, Equatable {
var userData = UserData()
}
extension AppState {
class UserData: ObservableObject, Equatable {
@Published var places:[Place] = []
}我注射了这样的环境:
@Environment(\.injected) private var injected: DIContainer最后查看使用它的情况:
var body: some View {
NavigationView {
ZStack {
List {
ForEach(injected.$appState.userData.places.wrappedValue){ place in
PlaceRow(place: place)
}
....问题是,即使数组是loade,视图也不会对此做出反应。只有当我导航到其他视图时,它才会刷新。另外,当我删除或添加数组中的新元素时,视图没有任何更改。如果你能给我一些想法,那就太好了。我在谷歌上搜索了4天,发现的一切都不适合我。
发布于 2020-06-06 12:51:40
如果您要像这样将DIContainer注入您的View中:
@Environment(\.injected) private var injected: DIContainer请记住,当View属性更改时,DIContainer不会刷新。你必须手动观察它们。
您可以尝试以下解决方案之一:
1)订阅AppState属性在.onReceive中的更改
@Environment(\.injected) private var injected: DIContainer
var body: some View {
NavigationView { ... }
.onReceive(injected.appState.userData.$places) { places in
// do something with places,
// eg. assign to a @State variable to be used in a `ForEach` loop...
}
}2)将UserData直接注入为@EnvironmentObject
@EnvironmentObject var userData: UserData
ContentView().environmentObject(container.appState.userData)因为UserData是一个ObservableObject,所以每当它的@Published属性发生变化时(例如。对places)进行了改性。
3)订阅ViewModel中的AppState/UserData,并观察View中唯一的ViewModel。
更详细的解释可以在您在问题中链接的同一个演示项目的这版本中找到。
https://stackoverflow.com/questions/62182199
复制相似问题