Нажатие кнопки в ForEach всегда выбирает последнюю кнопкуIOS

Программируем под IOS
Ответить
Anonymous
 Нажатие кнопки в ForEach всегда выбирает последнюю кнопку

Сообщение Anonymous »


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

класс AccentColorManager: ObservableObject { пусть цвета: [Цвет] = [.оранжевый, .желтый, .зеленый, .синий, .пурпурный, .коричневый, .голубой, .индиго, .мятный, .бирюзовый] @Published var AccentColor: Color = .orange // при первом запуске оранжевый цвет является цветом по умолчанию. @Published var AccentColorIndex: Int = 0 { DidSet { AccentColor = цвета[accentColorIndex] сохранитьАкцентЦветИндекс() объектWillChange.send() } } в этом() { loadAccentColorIndex() } частный let AccentColorIndexKey = "AccentColorIndex" частная функция saveAccentColorIndex() { UserDefaults.standard.set(accentColorIndex, forKey: AccentColorIndexKey) } частная функция loadAccentColorIndex() { если let StoreIndex = UserDefaults.standard.value (forKey: AccentColorIndexKey) как? Int { AccentColorIndex = хранимыйИндекс } } } В представлении ниже пользователю представлен список цветов. Независимо от того, какой цвет выбирает пользователь, всегда выбирается самый последний элемент списка, и последующие выборы не имеют никакого эффекта.

struct ActiveColorSectionView: Просмотр { @EnvironmentObject вар AccentColorManager: AccentColorManager var body: some View { Раздел(заголовок: Текст("Активный цвет")) { VStack(выравнивание: .leading) { ForEach(accentColorManager.colors.indices, id: \.self) {индекс в Кнопка (действие: { AccentColorManager.accentColorIndex = индекс }) { HStack { Текст(accentColorManager.colors[index].description) Разделитель() Круг() .frame(ширина: 20, высота: 20) .foregroundColor(accentColorManager.accentColorIndex == индекс? AccentColorManager.colors[index]: .clear) .overlay( Круг() .stroke(Color.primary, ширина линии: 2) ) } } .foregroundColor(accentColorManager.colors[индекс]) .padding(.вертикальный, 5) } } } .listRowBackground(Цвет(UIColor.systemBackground)) } } Я подозреваю, что использование индексного массива здесь может быть проблематичным, но я не вижу конкретной проблемы, и это кажется более подходящим, чем сохранение типа Color в UserDefaults.

Кроме того, я использую класс AccentColorManager в качестве переменной среды:
@main структура my_app: Приложение { @StateObject Private var AccentColorManager = AccentColorManager() var body: некоторая сцена { ОкноГруппа { Добро пожаловатьПросмотр() .environmentObject(accentColorManager) } } }
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «IOS»