Проблема со списком в SwiftUI

У меня есть следующее представление, которое состоит из списка пулов:

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?

Пулы перечислены в том порядке, в котором они доставляются poolStore.pools. Поэтому убедитесь, что пулы всегда возвращаются в одном и том же порядке, или отсортируйте эту коллекцию перед ее отображением.

Benzy Neez 19.05.2024 15:52

@BenzyNeez Я делаю следующее: let sortedArray = self.pools.sorted { $0.id < $1.id }

Learn2Code 19.05.2024 15:53

Несвязано, но почему .enumerated()? Индекс не используется.

vadian 19.05.2024 17:33

Я использую это для размещения рекламных баннеров в списке в качестве определенных индексов.

Learn2Code 19.05.2024 19:13
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
4
64
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Судя по комментариям, пулы перечислены в том порядке, в котором они доставлены 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 в логике?!

Learn2Code 19.05.2024 22:24

Рад слышать, что у вас все работает, спасибо, что приняли ответ. Казалось бы, poolStore.pools не отсортирован и порядок может измениться после какого-то обновления. ForEach показывает товары в том порядке, в котором они поставляются, сама сортировка не выполняется. Таким образом, предварительная сортировка коллекции, используемой в ForEach, гарантирует, что в списке пулы всегда будут отображаться в одном и том же порядке.

Benzy Neez 19.05.2024 23:06

Другие вопросы по теме