【问题标题】:.onDelete causes a crash because out of index.onDelete 导致崩溃,因为索引不足
【发布时间】:2021-11-30 13:21:20
【问题描述】:

有谁知道为什么这段代码会导致致命错误:当我尝试从列表中删除项目时,索引超出范围?目前,我能够创建更多文本字段并填充它们,但无法在应用程序崩溃的情况下删除任何内容。

import SwiftUI

struct options: View {

@State var multiOptions = [""]

var body: some View {
    
    VStack {
        List {
            ForEach(multiOptions.indices, id: \.self) { index in
                TextField("Enter your option...", text: $multiOptions[index])
            }
            .onDelete(perform: removeRow)
        }
        
        Button {
            multiOptions.append("")
        } label: {
            Image(systemName: "plus.circle")
        }

    }

}
func removeRow(at offsets: IndexSet) {
    multiOptions.remove(atOffsets: offsets)
}

}

【问题讨论】:

  • 按照我之前的回答,不要使用@State。 SwiftUI 视图是结构体,因此是不可变的,因此在需要更新时会重新创建它们。使用单独的模型对象来保存您的数组 @StateObject
  • 为了您的信息,您的代码原样在 macos 12.beta9、xcode 13.beta5(未发布)、针对 ios 15 和 macCatalyst 12 上运行良好。在真实设备上测试。在旧系统上可能会有所不同。但是,我建议您重新构建代码,并使用已经提到的建议。

标签: ios iphone swiftui


【解决方案1】:

这是自定义绑定的答案:

struct ContentView: View {
    
    @State var multiOptions = [""]
    
    var body: some View {
        
        VStack {
            List {
                ForEach(multiOptions.indices, id: \.self) { index in

                    TextField("Enter your option...", text: Binding(get: { return multiOptions[index] },
                                                                    set: { newValue in multiOptions[index] = newValue }))
  
                }
                .onDelete(perform: removeRow)
            }
            
            Button {
                multiOptions.append("")
            } label: {
                Image(systemName: "plus.circle")
            }
            
        }
        
    }
    func removeRow(at offsets: IndexSet) {
        multiOptions.remove(atOffsets: offsets)
    }
    
}

【讨论】:

    【解决方案2】:

    这似乎令人难以置信,但显然将实体中的属性命名为“id”是导致此行为的原因。我将 UUID 属性的名称更改为“myID”,现在可以删除。列表视图在预览中仍然完全不起作用,但它现在可以在模拟器和设备中使用。

    【讨论】:

    • 您确定您只是针对正确的问题发布正确的答案吗?看来您在这里发送了其他问题的其他答案作为答案!我会说你是在错误的聚会!
    • 是的,我只是在 xcode 12 上运行它,它已修复
    • 那么为什么不在这里分享您尝试过的代码!
    • 代码中没有...naming of an attribute in the entity 。你在说什么?您的回答没有解决这个问题。
    猜你喜欢
    • 1970-01-01
    • 2011-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-12
    • 2011-04-29
    • 1970-01-01
    • 2016-05-03
    相关资源
    最近更新 更多