在以下方面遇到了一些问题。
我在VStack中有一个列表,如下所示:
List{
ForEach(fetchRequest.wrappedValue, id: .self) { city in
NavigationLink(destination: CityView(city: city, moc: self.moc)) {
cityRow(city: city)
}
}
}
此列表是根据coreData fetchrequest填充的。每个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视图后立即初始化它。在这里可以找到一个简单的解决方案:SwiftUI-ObservableObject创建了多次。在LazyView中包裹您的Destination视图。
希望分享解决此问题的最新更新。
https://stackoverflow.com/a/66520131
这是避免创建多个ObservedObjects实例的方法。
共享这一点是因为仅仅在NavigationLink
中延迟加载并不能解决在运行时根据用户的操作刷新视图会多次创建和破坏ObservedObject
的问题。
因此,我们需要一些解决方案,其中我们的对象只创建一次,并且即使在视图刷新后仍然存在。