Вот мой код:
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
.
Нет, они отображаются, мне нужен способ скрыть галочку, пока не будет нажат X. Я также хотел бы, чтобы он скрывал X при нажатии, чтобы одновременно отображалась только одна из кнопок. По сути, одна кнопка должна отображаться только один раз. Как мне это сделать?
РедактироватьПосле последнего обновления вопроса вот исправленный ответ для решения проблемы «Кнопки меняются для всех элементов, а не для каждого отдельного элемента».
Вы можете скрыть или показать кнопки, используя переменную @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: извините, наверное, тогда я не понял вопроса. Что вы подразумеваете под «не изменятся ли все круги, если я коснусь только одного в цикле ForEach»? Разве вы не хотите скрыть один и показать только другой? Или вы хотите, чтобы они оба были показаны вместе? Можете ли вы привести в своем вопросе простой пример того, чего вы хотите достичь? Если я могу вам помочь, я отредактирую свой ответ.
Обновил мой вопрос. Спасибо за помощь.
Извините за беспокойство, но как я могу быстро включить все переключатели в операторе Foreach, не выходя из представления и не возвращаясь обратно?
@ user17864647: Я не уверен, что понял ваш последний вопрос, вы хотите переключать все элементы в списке одновременно? Или есть какой-то баг, не обновляющий вид? Я предлагаю вам открыть новый вопрос, чтобы другие люди тоже могли присоединиться.
Я не могу понять: ваши кнопки не отображаются с приведенным выше кодом?