ForEach onDelete Mac

Posted

技术标签:

【中文标题】ForEach onDelete Mac【英文标题】: 【发布时间】:2020-02-27 13:36:49 【问题描述】:

我想弄清楚如何从 Mac 的 swiftui 中的数组中删除。我能找到的所有文章都展示了如何以 UIKit 方式将 .ondelete 方法添加到 foreach 中。这不适用于 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

【问题讨论】:

这能回答你的问题***.com/a/60319531/1040347 吗? 如果我错过了该链接中的解决方案,我深表歉意。但我不认为它只有助于我看到的差异是使用点击手势。我希望它在 Mac 上单击按钮时删除。没有 iOS 样式列表删除选项。 我的链接没有多大帮助。 【参考方案1】:

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

下一个假设是VStack。绘制视图层次结构后,将不允许更改它。 如果您将 VStack 替换为 Group 并且下一个代码将起作用:

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 更改为您建议的组。它没有用,但至少我得到了一个新的错误,哈哈。 ForEach(_:content:) 应该只用于 constant 数据。而是将数据符合 Identifiable 或使用 ForEach(_:id:content:) 并提供明确的 id! 从这篇文章medium.com/swlh/…在reddit上找到了答案@ 不错。我在发布之前测试了我的代码 - 它有效。您的模型已经确认到Identifiable。没有它 forEach 将无法工作(在当前示例中)。你得到了什么错误?还有更多细节吗?【参考方案2】:

所以我能够在这个article 中找到答案,

而不是通过从for循环传递索引来调用array.remove(at),而是使用array.FirstIndex(where)调用它。

【讨论】:

老实说,很奇怪。 是的。我认为这与在调用此删除方法之前可以更改(即删除/添加等)在 foreach 中生成的索引有关。不过还是很奇怪,因为当我使用 firstIndex(where:) 时,我通过索引引用它。

以上是关于ForEach onDelete Mac的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI .onDelete 从 ForEach 获取 var

Swiftui foreach 索引超出范围 ondelete 问题

SwiftUI ForEach.onDelete 在 TabView 中无法正常工作

。onDelete在排序的ForEach中不起作用-SwiftUI

当 ForEach 中发生 onDelete 时如何更新其他 CoreData?

SwiftUI .onDelete 抛出致命错误:索引超出范围