0

在以下方面遇到了一些麻烦。

我在 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() 表明它们没有完全加载。

任何帮助都会非常感激,我无法弄清楚这是怎么发生的。

谢谢

4

2 回答 2

1

NavigationView 上的 Destination 不是惰性的,因此它会在创建 Destination 视图后立即初始化。可以在这里找到一个简单的解决方法:SwiftUI - ObservableObject created multiple times。将您的目标视图包装在 LazyView 中。

于 2020-11-06T21:32:02.607 回答
1

想分享解决此问题的最新更新。

https://stackoverflow.com/a/66520131

这是避免创建多个 ObservedObjects 实例的方法。

分享这一点,因为只是延迟加载NavigationLink并不能解决在运行时根据用户的操作刷新视图会创建销毁 ObservedObject多次的问题。

因此,我们需要一些解决方案,其中我们的对象只创建一次,并且即使在视图刷新后也仍然存在。

于 2021-03-07T18:57:59.363 回答