шаги для воспроизведения проблемы:
- Запуск кода. Элемент с надписью «Текст 2», нажав кнопку «Удалить» рядом с ним. 4 "< /li>
Обратите внимание на приложение сбоя с индексом вне диапазона ошибки < /li>
< /ol>соответствует идентифицируемому , поэтому Swiftui должен отслеживать идентичность каждого элемента.Код: Выделить всё
struct MyDataItem: Identifiable, Equatable { var id = UUID().uuidString var text: String = "" var placeholder: String = "" static func == (lhs: MyDataItem, rhs: MyDataItem) -> Bool { return lhs.id == rhs.id && lhs.text == rhs.text && lhs.placeholder == rhs.placeholder } } struct BugPrepro: View { @State var data: [MyDataItem] = [ MyDataItem(placeholder: "text 1"), MyDataItem(placeholder: "text 2"), MyDataItem(placeholder: "text 3"), MyDataItem(placeholder: "text 4") ] var body: some View { VStack { ForEach($data, id: \.id) { $dataItem in LineItemView(dataItem: $dataItem, onDelete: { data.removeAll { $0.id == dataItem.id } }) } } } } struct LineItemView: View, Equatable { @Binding var dataItem: MyDataItem var onDelete: () -> Void var body: some View { HStack { TextField(dataItem.placeholder, text: $dataItem.text) Button(action: onDelete) { Text("Delete") .foregroundColor(.red) } } .padding() .border(.black) } static func == (lhs: LineItemView, rhs: LineItemView) -> Bool { return lhs.dataItem == rhs.dataItem } } < /code> мое понимание: < /strong> < /p> MyDataItem
Реализуя equatable onlineitemview , я пытаюсь предотвратить ненужные обновления представления, чтобы улучшить производительность. />
Почему Textfield привязки смешиваются после удаления элемента при использовании эквабатационного в представлении? Как я могу предотвратить излишне повторное использование взглядов, не вызывая эту проблему?
Подробнее здесь: https://stackoverflow.com/questions/791 ... r-deletion