Неправильный элемент удаляется из LazyVGridIOS

Программируем под IOS
Ответить
Anonymous
 Неправильный элемент удаляется из LazyVGrid

Сообщение Anonymous »


Моя цель — создать такой список в SwiftUI


Изображение


Каждый раз, когда пользователь нажимает кнопку «Добавить», создается новая строка, а затем при проведении пальцем по экрану для удаления соответствующую строку необходимо удалить.

Чтобы сделать это, я начинаю с очень простой модели

struct SnagItem: Codable { частная (установленная) ссылка на переменную: Int = 0 сведения о частной (установленной) переменной: String = "" частный (набор) вар isCompleted: Bool = false перечисление CodingKeys: String, CodingKey, CaseIterable { ссылка на регистр = "Ссылка" детали дела = "Подробности" случай isCompleted = "Завершено" } } расширение SnagItem: Hashable { } Я использую эту модель в модели представления, которую хочу привязать к своему представлению SwiftUI. Это модель представления:

класс SnagItemViewModel: ObservableObject { частный пусть snagItem: SnagItem @Опубликованная информация о переменной: String = "" @Published var isCompleted: Bool = false init (withSnagItem snagItem: SnagItem) { self.snagItem = snagItem подробности = snagItem.details isCompleted = snagItem.isCompleted } } У меня есть другая модель представления, которая отслеживает все элементы (строки) с помощью массива. Это также обрабатывает добавление и удаление элементов.

класс SnagItemsViewModel: ObservableObject { @Published var snagItems: [SnagItemViewModel] = [SnagItemViewModel(withSnagItem: SnagItem())] func getSnagItem(по индексу: Int) -> SnagItemViewModel { snagItems[индекс] } функция addSnagItem() { snagItems.append(SnagItemViewModel(withSnagItem: SnagItem())) } func deleteSnagItemRecord (в indexSet: IndexSet) { Guard let index = indexSet.first else { return } snagItems.remove(at: index) } } @Published var snagItems: [SnagItemViewModel] = [SnagItemViewModel(withSnagItem: SnagItem())] Я создал представление SwiftUI, которое действует как контейнер:

struct SnagItemsView: Просмотр { @StateObject вар snagItemsViewModel: SnagItemsViewModel var body: some View { ForEach(0 ..< snagItemsViewModel.snagItems.count, id: \.self) { snagItemIndex в let snagItemViewModel = snagItemsViewModel.getSnagItem(at: snagItemIndex) SnagItemRowView (ссылка: snagItemIndex + 1, snagItemViewModel: snagItemViewModel) } .onDelete(выполнить: удалить(в:)) } func delete (в indexSet: IndexSet) { сАнимацией { snagItemsViewModel.deleteSnagItemRecord (в: indexSet) } } } Каждая строка имеет свое собственное представление:

struct SnagItemRowView: Просмотр { @State ссылка на переменную: Int @StateObject вар snagItemViewModel: SnagItemViewModel пусть GridItemColumnConfig = [ GridItem(.fixed(Constants.Frame.minGridItemWidth)), GridItem(.flexible()), GridItem(.fixed(Constants.Frame.minGridItemWidth)) ] var body: some View { LazyVGrid (столбцы: GridItemColumnConfig, интервал: 8) { ForEach(0 ..< SnagItem.CodingKeys.allCases.count, id: \.self) {columnIndex в let snagItemCategory = SnagItem.CodingKeys.allCases[columnIndex] если snagItemCategory == .reference { Текст("\(ссылка)") } иначе, если snagItemCategory == .details { TextField(snagItemViewModel.localizedText(for: .enterValue), текст: $snagItemViewModel.details, ось: .вертикальная) } еще { Toggle("", isOn: $snagItemViewModel.isCompleted) .labelsHidden() } } } } } По большей части все работает нормально.

Все начинается так:


Изображение


Когда пользователь нажимает «Добавить», добавляется еще одна строка, а повторение этого действия несколько раз приводит к добавлению новых строк:


Изображение


Проблемы начинаются, когда я пытаюсь удалить:


Изображение


Как вы можете видеть, я пытаюсь удалить строку 3, после удаления вместо этого удаляется строка 4, по крайней мере, с точки зрения пользовательского интерфейса:


Изображение


Я распечатал значения из моей функции get, и кажется, что модель представления на самом деле имеет правильные объекты, однако представление SwiftUI, похоже, не отображает правильные данные по какой-то причине:


Изображение


Я добавил точку останова в свою функцию удаления, чтобы проверить, правильный ли индекс передается, и кажется, что здесь все выглядит хорошо:


Изображение


Наконец, когда я пытаюсь добавить еще одну строку после процесса удаления, кажется, что старые данные добавляются снова:


Изображение


И снова, когда я проверяю модель представления, данные кажутся правильными, но представление SwiftUI показывает что-то другое.

Что я делаю не так и как это исправить?
Ответить

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

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

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

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

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