如何在SwiftUI中从列表中手动删除项目?

时间:2019-09-25 20:02:51

标签: swiftui

我尝试从列表中删除某些项目,但收到错误Thread 1: Fatal error: Index out of range。我知道onDelete,但是在macOS上,如何使用鼠标调用它尚不清楚

    @State var wishList = [
        "Item 1",
        "Item 2"
    ]

List {
    ForEach(wishList.indices) { index in
        Button(action: {

        }) {
            HStack {
                Text(self.wishList[index]) //Thread 1: Fatal error: Index out of range. 
                Button(action: {
                    RunLoop.main.perform {
                        self.wishList.remove(at: index)
                    }
                }) {
                    Image(systemName: "minus.circle").foregroundColor(.red)
                }

            }
        }
    }
}

修复: 我添加了id:\.self来修复我的代码。

    @State var wishList = [
        "Item 1",
        "Item 2"
    ]

List {
    ForEach(wishList.indices, id:\.self) { index in
        Button(action: {

        }) {
            HStack {
                Text(self.wishList[index]) //Thread 1: Fatal error: Index out of range. 
                Button(action: {
                    RunLoop.main.perform {
                        self.wishList.remove(at: index)
                    }
                }) {
                    Image(systemName: "minus.circle").foregroundColor(.red)
                }

            }
        }
    }
}

1 个答案:

答案 0 :(得分:1)

原因是错误的:

  

count(1)!=初始计数(2)。 ForEach(_:content:)仅应用于恒定数据。而是使数据符合Identifiable或使用ForEach(_:id:content:)并提供明确的id

相反,请使用Identifiable版本并直接对内容进行操作:

    List {
        ForEach(wishList, id: \.self) { content in
            HStack {
                Text(verbatim: content)

                Button(action: {
                    guard let index = self.wishList.firstIndex(of: content) else { return }
                    self.wishList.remove(at: index)
                }) {
                    Image(systemName: "minus.circle").foregroundColor(.red)
                }
            }
        }
    }

编辑:这是一个简单的版本:

    List(0..<wishList.count, id: \.self) { index in
        HStack {
            Text(verbatim: self.wishList[index])

            Button(action: {
                self.wishList.remove(at: index)
            }) {
                Image(systemName: "minus.circle").foregroundColor(.red)
            }
        }
    }