У меня есть следующее представление, которое состоит из списка пулов:
var body: some View {
ScrollView {
ForEach(Array(self.poolStore.pools.enumerated()), id: \.element) { index, element in
NavigationLink(destination: PoolMasterViewDetails(poolMasterViewRouter: EditDetails(), pool: element)) {
smallcardView(pool: element)
}
}
}
.onAppear() {
self.fetchPoolsInDashboard()
}
}
struct smallcardView: View {
let pool: Pool
var body: some View {
VStack() {
HStack {
if (pool.type == "Survivor") {
Image("survival")
.resizable()
.frame(width: 120, height: 90)
.cornerRadius(10)
} else {
Image("pickem")
.resizable()
.frame(width: 120, height: 90)
.cornerRadius(10)
}
VStack(alignment: .leading) {
Spacer()
Text(pool.name)
.foregroundColor(Color.textColor)
.font(.title3)
.frame(width: 225, alignment: .leading)
.padding(.bottom, 0.1)
Text(pool.id)
.foregroundColor(Color.textColor)
.font(.system(size: 16))
Spacer()
}
.padding(.leading)
Spacer()
}
}
.padding()
.frame(maxWidth: .infinity)
.frame(height: 120)
}
}
Pool Store сортирует предметы следующим образом:
let sortedArray = self.pools.sorted {
$0.id < $1.id
}
ЕСЛИ список содержит несколько пулов на панели управления пользователя, если пользователь щелкает, например, последний элемент в списке, происходит переход к подробному просмотру пула.
Когда они возвращаются на панель мониторинга (список пулов), выбранный ими элемент оказывается вверху списка, а не внизу списка (как ожидалось). Список также прокручивается до верхней части списка в представлении информационной панели!?
Поскольку список также упорядочен по poolID, поэтому он вообще оказался внизу списка!?
Я не уверен, как это исправить.
Я ожидаю, что пользователь щелкнет элемент в списке, перейдет к подробному представлению, а когда он вернется назад, список будет в том же порядке (по идентификатору пула) и что пользователь находится в том же месте прокрутки или местонахождении из элемент, на который они нажали.
Может ли кто-нибудь дать какую-либо информацию по этому поводу, знаете ли вы, является ли это ошибкой в SwiftUI?
@BenzyNeez Я делаю следующее: let sortedArray = self.pools.sorted { $0.id < $1.id }
Несвязано, но почему .enumerated()? Индекс не используется.
Я использую это для размещения рекламных баннеров в списке в качестве определенных индексов.





Судя по комментариям, пулы перечислены в том порядке, в котором они доставлены poolStore.pools. Поэтому вам нужно убедиться, что это всегда возвращает пулы в одном и том же порядке, или вам нужно отсортировать эту коллекцию перед ее отображением.
Вы сказали, что массив сортируется и присваивается sortedArray. Однако это не меняет порядок исходной коллекции.
.sort вместо .sorted.ForEach на poolStore.sortedArray вместо poolStore.pools.poolStore:var sortedPools: [Pool] {
pools.sorted { $0.id < $1.id }
}
Затем вы можете использовать эту отсортированную коллекцию для ForEach:
ForEach(Array(poolStore.sortedPools.enumerated()), id: \.element) { index, element in
// ...
}
Солн сработал! За что я чрезвычайно благодарен... НО я просто не понимаю, почему это происходит и почему в моем исходном коде возникла проблема!? Может кто-нибудь объяснить мне, почему в моем коде есть gap в логике?!
Рад слышать, что у вас все работает, спасибо, что приняли ответ. Казалось бы, poolStore.pools не отсортирован и порядок может измениться после какого-то обновления. ForEach показывает товары в том порядке, в котором они поставляются, сама сортировка не выполняется. Таким образом, предварительная сортировка коллекции, используемой в ForEach, гарантирует, что в списке пулы всегда будут отображаться в одном и том же порядке.
Пулы перечислены в том порядке, в котором они доставляются
poolStore.pools. Поэтому убедитесь, что пулы всегда возвращаются в одном и том же порядке, или отсортируйте эту коллекцию перед ее отображением.