Ну, на самом деле это дефект SwiftUI, представление, находящееся вне иерархии представления, не должно обновляться (вызывается ie. body
) - оно должно обновляться сразу после следующего появления. (Я отправил отзыв # FB7659875 и рекомендую сделать то же самое для всех, кого это касается - это тот случай, когда дубликаты лучше)
Между тем, ниже возможен временный обходной путь (однако он продолжит работу даже после того, как Apple исправит вопрос, так что это безопасно). Идея состоит в том, чтобы использовать локальную модель состояния представления в качестве промежуточного между представлением и опубликованным свойством и обновлять его только тогда, когда представление является видимым.
Предоставлено только исправленное представление, подлежащее замене в упомянутом проекте.
Протестировано с Xcode 11.4 / iOS 13.4 - без неожиданного «прыжка назад»

struct LandmarkList: View {
@EnvironmentObject private var userData: UserData
@State private var landmarks = [Landmark]() // local model
@State private var isVisible = false // own visibility state
var body: some View {
NavigationView {
List {
Toggle(isOn: $userData.showFavoritesOnly) {
Text("Show Favorites Only")
}
ForEach(landmarks) { landmark in
if !self.userData.showFavoritesOnly || landmark.isFavorite {
NavigationLink(
destination: LandmarkDetail(landmark: landmark)
.environmentObject(self.userData)
) {
LandmarkRow(landmark: landmark)
}
}
}
}
.onReceive(userData.$landmarks) { array in // observe external model
if self.isVisible {
self.landmarks = array // update local only if visible
}
}
.onAppear {
self.isVisible = true // track own state
self.landmarks = self.userData.landmarks
}
.onDisappear { self.isVisible = false } // track own state
.navigationBarTitle(Text("Landmarks"))
}
}
}