从数组中删除-致命错误:索引超出范围-SwiftUI绑定

时间:2020-07-07 17:16:11

标签: ios 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 个答案:

答案 0 :(得分:2)

使用预先给定的索引删除总是有风险的。在后台等环境中数据更改的可能性。在尝试删除该项目时请获取索引,以确保其具有正确的索引。万一数据在其他地方改变了。 这应该可以帮助您了解:

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)"))
        }
        
    }
}

产生这个:

enter image description here

如前所述,您的错误在于第一个视图。这很可能是因为您要使用索引数来构建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)

}