ForEach onDelete Mac

时间:2020-02-27 13:36:49

标签: swift macos swiftui

我试图弄清楚如何从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
}

2 个答案:

答案 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)调用它。