Swift ForEach onDelete Mac

Swift ForEach onDelete Mac,swift,macos,swiftui,Swift,Macos,Swiftui,我正试图弄清楚如何在swiftui for Mac中从数组中删除。我能找到的所有文章都展示了如何通过将.ondelete方法添加到foreach中的UIKit方法来实现这一点。这不适用于Mac,因为我没有像iOS那样的红色删除按钮。那么,如何在Mac上的ForEach中从数组中删除项呢。 这是我尝试过的代码,它给出了错误 致命错误:索引超出范围:文件 您的ForEach代码部分完全正确。 可能的错误源可能是该行 TextValue:\self.splitItems[0].name-删除所有项目后

我正试图弄清楚如何在swiftui for Mac中从数组中删除。我能找到的所有文章都展示了如何通过将.ondelete方法添加到foreach中的UIKit方法来实现这一点。这不适用于Mac,因为我没有像iOS那样的红色删除按钮。那么,如何在Mac上的ForEach中从数组中删除项呢。 这是我尝试过的代码,它给出了错误

致命错误:索引超出范围:文件

您的ForEach代码部分完全正确。 可能的错误源可能是该行 TextValue:\self.splitItems[0].name-删除所有项目后,此操作肯定会崩溃

下一个假设是VStack。绘制视图层次后,将不允许对其进行更改。 如果将VStack替换为,则下一个代码将正常工作:

var body:一些观点{ 团体{ if!self.splitItems.isEmpty{ TextValue:\self.splitItems[0]。名称 }否则{ 文本列表为空 } ForEachself.splitItems.Indexes,id:\.self{index in HStack{ text字段项,text:self.$splitItems[index].name 按钮操作:{self.removietemindex:index}{Text-} } } } .framemaxWidth:.infinity,maxHeight:.infinity }
所以我能从中找到答案


不是通过从for循环传递索引来调用array.removeat,而是使用array.FirstIndexwhere调用它。

这是否回答了您的问题?如果我错过了该链接中的解决方案,我深表歉意。但我不认为这有什么帮助,我所看到的唯一区别是使用敲击手势。我想它删除按钮点击Mac。没有iOS样式列表删除选项。我的链接没有多大帮助。文本字段只是用来测试编辑文本字段是否有效。这是不必要的,所以我删除了这一行,并改变了vstack的一组,正如你所建议的。它不起作用,但至少我得到了一个新的错误lol.ForEach_2;:content:应该只用于常量数据。而是将数据与可识别的数据一致,或使用ForEach:id:content:并提供显式id!在reddit上找到了这篇文章的答案。在发布代码之前,我测试了代码,结果成功了。您的模型已确认为可识别。如果没有它,forEach将无法在当前示例中工作。你犯了什么错误?还有更多的细节吗?说实话,很奇怪。是的。我认为这与foreach中生成的索引有关,可以是changedie delete/add等,然后再调用这个delete方法。但是仍然很奇怪,因为当我使用firstIndexwhere:时,我通过索引引用它。
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
}