我在视图中创建了一个 ObservableObject。
@ObservedObject var selectionModel = FilterSelectionModel()
我在里面放置了一个断点FilterSelectionModel
's init
函数并且被多次调用。因为这个视图是NavigationLink
,据我所知,它是随后创建的,并随之创建了选择模型。当我导航到视图时,会再次创建选择模型。
在同一个视图中,我有一个“子视图”,我将选择模型作为EnvironmentObject
所以子视图可以改变它。
AddFilterScreen().environmentObject(self.selectionModel)
当子视图被关闭时,selectionModel 将再次被创建,并且对其所做的更改将会消失。
有趣的注释: 在最顶层是NavigationView
。如果我添加
.navigationViewStyle(StackNavigationViewStyle())
to this NavigationView
,我的选择模型的更改消失了。但如果我do not添加navigationStyle
,selectionModel 在子视图中所做的更改仍然保留! (但我不想要分割导航视图,我想要堆叠导航视图)
在这两种情况下 - 有或没有navigationStyle
,selectionModel被创建多次。我无法理解这一切应该如何可靠地工作。
最新的 SwiftUI 更新为这个问题带来了解决方案。 (iOS 14 及以上)
@StateObject
是我们应该使用的而不是@ObservedObject
,但仅限于创建该对象的位置,而不是在我们传递同一对象的子视图中的所有位置。
For eg-
class User: ObservableObject {
var name = "mohit"
}
struct ContentView: View {
@StateObject var user = User()
var body: some View {
VStack {
Text("name: \(user.name)")
NameCount(user: self.user)
}
}
}
struct NameCount: View {
@ObservedObject var user
var body: some View {
Text("count: \(user.name.count)")
}
}
在上面的例子中,只有视图负责(内容视图)用于创建该对象正在注释User
对象与@StateObject
和所有其他视图(姓名计数)共享正在使用的对象@ObservedObject
.
通过这种方法,每当您的父母查看(内容视图) 被重新创建,则User
对象不会被重新创建,并且它将保留其@State,而您的孩子只看到observing
到相同的User
对象不必关心它的重新创建。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)