ObservedObject 在导航到其视图之前被多次加载
ObservedObject being loaded multiple times prior to navigation to its view
遇到以下问题。
我在 VStack 中有一个列表如下:
List{
ForEach(fetchRequest.wrappedValue, id: \.self) { city in
NavigationLink(destination: CityView(city: city, moc: self.moc)) {
cityRow(city: city)
}
}
}
此列表是根据 coreData 获取请求填充的。每个 NavigationLinks 导航到 CityView 并传递一个城市对象。
CityView 有一个可观察对象 'notificationHandler' 定义如下:
struct CityView: View {
@ObservedObject var notificationHandler = NotificationHandler()
@ObservedObject var city: City
var body: some View {
}
}
NotificationHandler() 设置一个 NotificationHandler 实例,并在 init 中设置一些通知观察者,如下所示:
import Foundation
import Combine
class NotificationHandler: ObservableObject {
let nc = NotificationHandler.default
@Published var networkActive: Bool = false
init() {
nc.addObserver(self, selector: #selector(networkStart), name: Notification.Name("networkingStart"), object: nil)
nc.addObserver(self, selector: #selector(networkStop), name: Notification.Name("networkingStop"), object: nil)
}
}
我的问题是 - 当应用程序启动到第一个视图时,它包含上面的列表 - 我正在启动多个 NotificationHandler 实例 - 列表的每一行都有一个。 - 这让我相信列表中的 NavigationLinks 正在预先加载它们持有的 CityView。但是我相信情况不再如此,延迟加载是默认行为。添加到在 CityView 中添加 onAppear() 表明它们没有被完全加载。
非常感谢任何帮助,我不知道这是怎么回事。
谢谢
NavigationView 上的 Destination 不是惰性的,因此它会在创建后立即初始化 Destination 视图。可以在此处找到一个简单的解决方法:。将您的目标视图包装在 LazyView 中。
想分享解决此问题的最新更新。
这是避免创建多个 ObservedObjects 实例的方法。
分享这个是因为 NavigationLink
中的延迟加载并不能解决 根据用户操作 创建 在运行时刷新 视图的问题 和 多次摧毁 ObservedObject
。
因此,我们需要一些解决方案,让我们的对象只创建一次,并且即使在刷新视图后也仍然存在。
遇到以下问题。
我在 VStack 中有一个列表如下:
List{
ForEach(fetchRequest.wrappedValue, id: \.self) { city in
NavigationLink(destination: CityView(city: city, moc: self.moc)) {
cityRow(city: city)
}
}
}
此列表是根据 coreData 获取请求填充的。每个 NavigationLinks 导航到 CityView 并传递一个城市对象。
CityView 有一个可观察对象 'notificationHandler' 定义如下:
struct CityView: View {
@ObservedObject var notificationHandler = NotificationHandler()
@ObservedObject var city: City
var body: some View {
}
}
NotificationHandler() 设置一个 NotificationHandler 实例,并在 init 中设置一些通知观察者,如下所示:
import Foundation
import Combine
class NotificationHandler: ObservableObject {
let nc = NotificationHandler.default
@Published var networkActive: Bool = false
init() {
nc.addObserver(self, selector: #selector(networkStart), name: Notification.Name("networkingStart"), object: nil)
nc.addObserver(self, selector: #selector(networkStop), name: Notification.Name("networkingStop"), object: nil)
}
}
我的问题是 - 当应用程序启动到第一个视图时,它包含上面的列表 - 我正在启动多个 NotificationHandler 实例 - 列表的每一行都有一个。 - 这让我相信列表中的 NavigationLinks 正在预先加载它们持有的 CityView。但是我相信情况不再如此,延迟加载是默认行为。添加到在 CityView 中添加 onAppear() 表明它们没有被完全加载。
非常感谢任何帮助,我不知道这是怎么回事。
谢谢
NavigationView 上的 Destination 不是惰性的,因此它会在创建后立即初始化 Destination 视图。可以在此处找到一个简单的解决方法:
想分享解决此问题的最新更新。
这是避免创建多个 ObservedObjects 实例的方法。
分享这个是因为 NavigationLink
中的延迟加载并不能解决 根据用户操作 创建 在运行时刷新 视图的问题 和 多次摧毁 ObservedObject
。
因此,我们需要一些解决方案,让我们的对象只创建一次,并且即使在刷新视图后也仍然存在。