我试图弄清楚如何从swiftui for Mac中的数组中删除。我能找到的所有文章都展示了如何通过将.ondelete方法添加到foreach中来实现UIKit方法。这不适用于Mac,因为我没有iOS那样的红色删除按钮。因此,如何在Mac上的ForEach中从阵列中删除项目。 这是我尝试过的代码,它给我错误
Fatal error: Index out of range: file
import SwiftUI
struct ContentView: View {
@State var splitItems:[SplitItem] = [
SplitItem(id: 0, name: "Item#1"),
SplitItem(id: 1, name: "Item#2")
]
var body: some View {
VStack {
Text("Value: \(self.splitItems[0].name)")
ForEach(self.splitItems.indices, id:\.self) { index in
HStack {
TextField("Item# ", text: self.$splitItems[index].name)
Button(action: {self.removeItem(index: index)}) {Text("-")}
}
}
}
.frame(maxWidth: .infinity, maxHeight: .infinity)
}
func removeItem(index:Int) {
self.splitItems.remove(at: index)
}
}
struct SplitItem:Identifiable {
var id:Int
var name:String
}
答案 0 :(得分:1)
您的Text("Value: \(self.splitItems[0].name)")
代码部分完全正确。
可能的错误源可能是该行
VStack
-删除所有项目后,肯定会崩溃。
下一个假设是var body: some View {
Group {
if !self.splitItems.isEmpty {
Text("Value: \(self.splitItems[0].name)")
} else {
Text("List is empty")
}
ForEach(self.splitItems.indices, id:\.self) { index in
HStack {
TextField("Item# ", text: self.$splitItems[index].name)
Button(action: {self.removeItem(index: index)}) {Text("-")}
}
}
}
.frame(maxWidth: .infinity, maxHeight: .infinity)
}
。绘制视图层次结构后,将无法对其进行更改。
如果您将VStack替换为explanation,那么下一个代码将起作用:
df1
答案 1 :(得分:0)
所以我能够在此article中找到答案,
不是通过传递for循环中的索引来调用array.remove(at),而是使用array.FirstIndex(where)调用它。