我在 iOS 15 / SwiftUi 3.0 上的一个应用程序中遇到了一个非常奇怪的错误 - 找不到任何信息。
我有一系列 3 个屏幕,每个屏幕都使用标签/选择 NavigationLink 相互链接,如下所示:
NavigationLink(destination: CityListView(city: city, selection: $citySelection, orgId: self.orgId), tag: city.id, selection: $citySelection) {
CityRow(city: city)
}
$citySelection 是每个后续视图的绑定,以允许应用程序在需要时以编程方式将视图弹回第一个视图。
但是,从 iOS 15 开始,当应用程序从后台启动时会出现非常奇怪的行为。基本上所有视图都会弹回第一个视图。即使我删除了上述所有绑定,它仍然会发生,并且似乎与我的 @EnvironmentObject 之一有关。
这些视图中的每一个都可以访问@EnvironmentObject NotificationHandler - 从应用程序中的许多地方调用通知处理程序以让用户知道正在发生的事情 - 后台处理/api调用等。它非常简单 - 代码如下:
class NotificationHandler: ObservableObject {
// Boot Notification Center
let nc = NotificationCenter.default
@Published var networkActive: Bool = false
init() {
print("NOTIFICATION HANDLER BOOTED")
nc.addObserver(self, selector: #selector(networkStart), name: Notification.Name("networkingStart"), object: nil)
nc.addObserver(self, selector: #selector(networkStop), name: Notification.Name("networkingStop"), object: nil)
}
@objc private func networkStart() {
self.networkActive = true
}
@objc private func networkStop() {
self.networkActive = false
}
}
我的三个屏幕中的每一个都访问 networkActive 变量来决定是否需要显示进度条:
if self.notificationHandler.networkActive {
ProgressBar()
Spacer()
}
问题是,当应用程序从后台返回时,如果完全使用了 notificationHandler,应用程序会将所有屏幕弹回第一个屏幕。
如果我从第一个 NavigationLink 视图中删除 @EnvironmentObject,则此行为会停止,但如果没有它,我显然无法使用进度条。在任何其他视图上访问 @EnvironmentObject 不会导致此行为,只会导致第一个。
此外,此行为不会在 iOS 14.5 上发生
任何想法都会非常感激。
谢谢