您的假设是正确的,即自动导航回到主视图是由于getAllRestaurants()中的观察者触发了restaurantList的更改,这导致SwiftUI重新渲染视图并重置导航堆栈.以下是您问题的全面解决方案:
出现这个问题是因为每次更新您的restaurantList时,SwiftUI都会认为它需要更新整个视图,从而重置导航堆栈.为了解决这个问题,您可以通过手动管理导航链接的状态或改变处理数据更新的方式来使您的视图对数据更改更具弹性.以下是一些策略:
Option 1: Using a stable identifier for NavigationLink
如果餐厅符合Identiable,请使用其id而不是.\以获得更稳定的身份认同.如果Restaurant不符合Identiable,您可以向Restaurant模型添加标识符:
struct Restaurant: Identifiable {
let id: UUID = UUID()
var name: String
}
// Then in your view
ForEach(restaurantList, id: \.id) { restaurant in
NavigationLink(destination: IndividualRestaurantView(restaurant: restaurant)){
ZStack { Text(restaurant.name) }
}
}
这样,即使restaurantList更新,SwiftUI也可以维护导航链接的状态,因为餐厅的身份没有更改.
Option 2: Avoid unnecessary updates
另一种方法是最大限度地减少对restaurantList本身的更新.仅在必要时更新restaurantList:
func getAllRestaurantsInParameters(lat: Double, long: Double){
self.repo.getAllRestaurants().watch { restaurants in
// Convert fetched array to identifiable if not already
let updatedList = (restaurants as! [Restaurant])
if updatedList.map(\.id) != self.restaurantList.map(\.id) {
self.restaurantList = updatedList
}
}
}
此代码片段确保仅在获取的餐厅列表实际上与基于餐厅ID的当前列表不同时才更新restaurantList,从而可能减少不必要的视图刷新.
Option 3: Use a different state management approach
如果上述方法不能很好地适应您的应用程序的架构,请考虑对您的餐厅数据使用不同的状态管理方法,例如Observer:
class RestaurantViewModel: ObservableObject {
@Published var restaurantList: [Restaurant] = []
init() {
loadRestaurants()
}
func loadRestaurants() {
// Simulation of data fetch and watching
repo.getAllRestaurants().watch { [weak self] restaurants in
DispatchQueue.main.async {
self?.restaurantList = (restaurants as! [Restaurant])
}
}
}
}
// In your SwiftUI view
@StateObject private var viewModel = RestaurantViewModel()
NavigationView {
List {
ForEach(viewModel.restaurantList, id: \.id) { restaurant in
NavigationLink(destination: IndividualRestaurantView(restaurant: restaurant)) {
ZStack { Text(restaurant.name) }
}
}
}
}
使用Observable对象并同步更新UI可以帮助更干净地管理状态更改并避免不必要的导航弹出.
通过使用这些策略之一,您应该能够控制SwiftUI应用程序中的数据更新引起的不必要的导航重置.由于我对您的应用程序的 struct 一无所知,请确保您 Select 正确的选项,因为这一切都是为了为您的特定应用程序的架构和需求找到正确的平衡.
希望这对你有帮助!