Swiftui TextFields в Foreach с эквалентными взглядами плохо себя поедут после удаленияIOS

Программируем под IOS
Ответить Пред. темаСлед. тема
Anonymous
 Swiftui TextFields в Foreach с эквалентными взглядами плохо себя поедут после удаления

Сообщение Anonymous »

Я разрабатываю приложение Swiftui, где я отображаю список элементов, каждый из которых содержит текстовое поле. Поскольку редактирование Textfield в одном из этих элементов приводит к повторному разрешению всех представлений элементов, я решил реализовать Equatable в представлениях элементов для повышения производительности. В частности, когда я редактирую текстовое поле после удаления, текст обновляется в нескольких полях одновременно. Это также может вызвать следующую ошибку, если она пытается обновить текстовое поле, которое больше не существует: Swift/ContigountArrayBuffer.Swift: 675: фатальная ошибка: индекс вне диапазона
шаги для воспроизведения проблемы:
  • Запуск кода. Элемент с надписью «Текст 2», нажав кнопку «Удалить» рядом с ним. 4 "< /li>
    Обратите внимание на приложение сбоя с индексом вне диапазона ошибки < /li>
    < /ol>

    Код: Выделить всё

    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
    соответствует идентифицируемому , поэтому Swiftui должен отслеживать идентичность каждого элемента.
    Реализуя equatable onlineitemview , я пытаюсь предотвратить ненужные обновления представления, чтобы улучшить производительность. />
Мой вопрос: [/b]
Почему Textfield привязки смешиваются после удаления элемента при использовании эквабатационного в представлении? Как я могу предотвратить излишне повторное использование взглядов, не вызывая эту проблему?

Подробнее здесь: https://stackoverflow.com/questions/791 ... r-deletion
Реклама
Ответить Пред. темаСлед. тема

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

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

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

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

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

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