Добавление и удаление кнопок в представлении ForEach

Вот мой код:

                        ForEach(StaffList, id: \.self) { item in
                                HStack {
                                    Text("\(item)")
                                    Spacer(minLength: 0)
                                    Image(systemName: "x.circle")
                                        .foregroundColor(.red)
                                        .onTapGesture {
                                            //TODO: Remove user UUID from array + Show add button
                                        }
                                    Image(systemName: "checkmark.circle")
                                        .foregroundColor(.blue)
                                        .onTapGesture {
                                            //TODO: Add user UUID from array + Show remove button
                                        }
                            }
                        }

Простым решением была бы одна переменная @state в Struct для каждого в цикле, но возникает проблема. Потому что каждая кнопка назначается одной и той же переменной. Когда переменная изменяется, все они меняются. Например:


@State var isShowing = false


                        ForEach(StaffList, id: \.self) { item in
                                HStack {
                                    Text("\(item)")
                                    Spacer(minLength: 0)
                                if isShowing {
                                    Image(systemName: "x.circle")
                                        .foregroundColor(.red)
                                        .onTapGesture {
                                            //TODO: Remove user UUID from array + Show add button
                                            is Showing = true
                                        }
                                    } else {
                                    Image(systemName: "checkmark.circle")
                                        .foregroundColor(.blue)
                                        .onTapGesture {
                                            //TODO: Add user UUID from array + Show remove button
                                            isShowing = false
                                        }
                                 }
                            }
                        }

Технически это работает, но примите во внимание неограниченное количество людей в StaffList. Если я нажму X на одном из них, все они обновятся, чтобы показать Checkmark. Целью является ForEach, все они имеют свой собственный набор изменений, если это произойдет с тех пор. Поэтому, когда я нажимаю X на одном из них, он обновляется и показывает Checkmark, но ни один из остальных в обновлении цикла ForEach не показывает X.

Я не могу понять: ваши кнопки не отображаются с приведенным выше кодом?

HunterLion 22.03.2022 22:30

Нет, они отображаются, мне нужен способ скрыть галочку, пока не будет нажат X. Я также хотел бы, чтобы он скрывал X при нажатии, чтобы одновременно отображалась только одна из кнопок. По сути, одна кнопка должна отображаться только один раз. Как мне это сделать?

user17864647 22.03.2022 22:50
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать 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
2
45
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

РедактироватьПосле последнего обновления вопроса вот исправленный ответ для решения проблемы «Кнопки меняются для всех элементов, а не для каждого отдельного элемента».

Вы можете скрыть или показать кнопки, используя переменную @State. В сети есть несколько обучающих программ.

Но чтобы изменить кнопки для каждого отдельного элемента StaffList отдельно (которое нам лучше назвать staffList, поскольку это переменная), вам нужно иметь одну переменную @State для каждого элемента в ForEach. Этого можно добиться, создав вторичное представление, которое в приведенном ниже примере я назвал ItemView.

Вот код:

struct YourMainView: View {
    // This is not the right place for the @State variable that affects each single item
    // @State var isShowing = false

    // Other variable declarations

    var body: some View {

        ForEach(staffList, id: \.self) { item in
            ItemView(item: item)
        }
    }
}

// This is the view of each single item
struct ItemView: View {

    let item: StaffListItemType    // Whatever the actual type is

    // Here is the right place to manage it (always make it private)
    @State private var isShowing = false

    var body: some View {
            HStack {
               Text("\(item)")
               Spacer(minLength: 0)
               if isShowing {
                    Image(systemName: "x.circle")
                        .foregroundColor(.red)
                        .onTapGesture {
                            //TODO: Remove user UUID from array + Show add button
                            isShowing = false  // If it's true, it needs to become false. Or, use .toggle()
                         }
               } else {
                    Image(systemName: "checkmark.circle")
                        .foregroundColor(.blue)
                        .onTapGesture {
                             //TODO: Add user UUID from array + Show remove button
                             isShowing = true  // If it's false, it needs to become true. Or, use .toggle()
                         }
               }
            }
    }
}

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

user17864647 23.03.2022 13:41

@ user17864647: извините, наверное, тогда я не понял вопроса. Что вы подразумеваете под «не изменятся ли все круги, если я коснусь только одного в цикле ForEach»? Разве вы не хотите скрыть один и показать только другой? Или вы хотите, чтобы они оба были показаны вместе? Можете ли вы привести в своем вопросе простой пример того, чего вы хотите достичь? Если я могу вам помочь, я отредактирую свой ответ.

HunterLion 23.03.2022 18:53

Обновил мой вопрос. Спасибо за помощь.

user17864647 24.03.2022 03:07

Извините за беспокойство, но как я могу быстро включить все переключатели в операторе Foreach, не выходя из представления и не возвращаясь обратно?

user17864647 25.03.2022 13:27

@ user17864647: Я не уверен, что понял ваш последний вопрос, вы хотите переключать все элементы в списке одновременно? Или есть какой-то баг, не обновляющий вид? Я предлагаю вам открыть новый вопрос, чтобы другие люди тоже могли присоединиться.

HunterLion 25.03.2022 14:08
stackoverflow.com/q/71623801/17864647
user17864647 25.03.2022 23:41

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