SwiftUI:如何防止视图刷新时滚动重置



我有一个列表,其中包含一个刷新按钮,当用户点击该按钮时,该按钮将刷新该行的内容。我的实现是有效的,但列表视图将被重置并滚动回列表的顶部。

我已经在这里查看了SO帖子以获得解决方案,但我的实现似乎一开始没有任何.id(UUID().uuidString)

代码:

struct FavouritesListView: View {
@StateObject private var viewModel = FavouritesListViewModel()

var body: some View {
List {
ForEach(viewModel.favouriteBusStops) { busStop in
Section {
FavouriteView(busStop: busStop)
}
}
}
}
}
struct FavouriteView: View {
@StateObject private var viewModel: BusStopDetailViewModel
var busStop: BusStopEntity

init(busStop: BusStopEntity) {
self.busStop = busStop
_viewModel = StateObject(wrappedValue: BusStopDetailViewModel(busStop: busStop))
}

var body: some View {
VStack(alignment: .leading) {
HStack(spacing: 20) {
//Other UI components

//Refresh button
Button {
viewModel.refresh(busStop: busStop)
} label: {
Image(systemName: "arrow.clockwise")
}
}

if viewModel.isLoading {
CenteredCircularProgressView()
} else {
if let arrivalInfo = viewModel.arrivalInfo {
//Other UI components
}
}
}
}
}
class BusStopDetailViewModel: ObservableObject {
@Published var arrivalInfo: BusArrivalInfo?
@Published var isLoading = false

init(busStop: BusStopEntity) {
getArrivalInfo(busStop: busStop)
}

func getArrivalInfo(busStop: BusStopEntity) {
isLoading = true

APIClient.shared.getBusArrivalInfo(busStopCode: busStop.busStopCode) { result in
DispatchQueue.main.async {
switch result {
case .success(let arrivalInfo):
self.arrivalInfo = arrivalInfo
case .failure(let error):
print("Err", error.localizedDescription)
}

self.isLoading = false
}
}
}

func refresh(busStop: BusStopEntity) {
getArrivalInfo(busStop: busStop)
}
}

我想要的是,只有当点击刷新按钮时,该行才会刷新,并且滚动视图不会重置到顶部。

尝试使您的FavoriteView相等(请参阅stackoverflow.com/a/60483313/12299030(,使其仅依赖于BusStopEntity,并且对于相同的总线停止(通过某些标识符等(是相同的。

最新更新