Удаление из массива - Неустранимая ошибка: индекс вне допустимого диапазона - Связывание SwiftUI

Я пытаюсь разобраться в привязках SwiftUI. Здесь я отображаю массив в представлении и привязываю значения ко второму представлению. Во втором представлении я удаляю данные из массива.

Однако я получаю следующее:

Неустранимая ошибка: индекс вне допустимого диапазона

Я не получаю сообщение об ошибке self.person.notes.remove(at: self.index)фактически это удаление примечания в массиве. Он должен быть на первом месте при использованииForEachпоскольку массив был изменен и теперь он находится за пределами поля. Но я не уверен, как это обойти? НесомненноBinding должен был решить это.

Просмотр 1

ForEach(self.person.notes.indices, id:\.self) { index in

   NoteView(person: self.$person, room: self.$home.notes[index], index: index)

}

Просмотр 2

@Binding var person: Person
@Binding var note: Note
var index: Int

if self.index > 0 {
       Button(action: {
             self.person.notes.remove(at: self.index)
       }) {
           Text("Remove")
       }
 }

Есть идеи, как это должно работать в SwiftUI?

1 ответ

Решение

Удаление с заранее заданным индексом - всегда риск. Возможность изменения данных в фоновом режиме и т. Д. Получите индекс при попытке удалить элемент, чтобы убедиться, что он правильный. На случай, если данные изменились где-то еще. Это должно помочь вам понять:

struct ContentView: View {
    
    @State var myData: Array<String> = ["first", "second", "third"]
    
    var body: some View {
        ForEach(self.myData, id: \.self) { data in
            SecondView(myData: self.$myData, data: data)
        }
    }
}

struct SecondView: View {
    
    @Binding var myData: Array<String>
    // the data that is being tied to the view
    var data: String
    
    var body: some View {
        
        Button(action: {
            // calculate the index at the time of removal
            if let index = self.myData.firstIndex(of: self.data) {
                self.myData.remove(at: index)
            }
        }) {
            Rectangle().foregroundColor(Color.red).frame(width: 100, height: 100).overlay(Text("Button \(self.data)"))
        }
        
    }
}

Производит это:

Как вы упомянули, ваша ошибка заключается в первом взгляде. Скорее всего, это связано с тем, что вы создаете ForEach с количеством индексов. В тот момент, когда вы его удаляете, ForEach сталкивается с ошибкой, поскольку теряет "отслеживание" элемента, а элемент с индексом, предоставленным ForEach, больше не существует. Попробуй это:

ForEach(self.person.notes, id:\.self) { note in

   // Remove the index and calculate it on the second view as shown above. This then should solve the problem
   NoteView(person: self.$person, room: self.$home.notes)

}
Другие вопросы по тегам