Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >致命错误:从SwiftUI列表中的Firebase中删除项目时,索引超出范围

致命错误:从SwiftUI列表中的Firebase中删除项目时,索引超出范围
EN

Stack Overflow用户
提问于 2020-12-10 12:34:36
回答 1查看 77关注 0票数 0

我尝试了这里和其他地方提出的所有类型的解决方案(例如,添加集合的扩展,安全元素迭代等),但不幸的是没有一个有效。我也试过改“最后!”为了“第一!”在onDelete代码中,但这会导致相同的问题,尽管令人惊讶的是,它确实适用于我所见过的其他线程中的其他线程。我应该注意的是,只有当我在我的应用程序中结合了CoreData和Firebase时,这种情况才开始发生。您的帮助将不胜感激。提前谢谢。

用作环境对象并启动Firebase的类:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class DayData: ObservableObject, Identifiable  {
    @Published var date = Date()
    @Published var completed = false
    @Published var percentage: Double = 0.0
    @Published var liquids: Double = 0
    
    var allData : [DayCellModel] = []
    
        let dbRef = Firestore.firestore()
        init() {
            readAllData()
        }
        func readAllData(){
            
            
            dbRef.collection("keanu").addSnapshotListener{ (snap, err) in

                guard let docs = snap else { return }

               
                    self.allData = docs.documents.compactMap({ (doc) -> DayCellModel? in
                        return try! doc.data(as: DayCellModel.self)
                    })
            } 

仅用于Firebase的DayCellModel结构:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
struct DayCellModel : Identifiable, Codable {

    @DocumentID var id: String?
    var date : Date = Date()
    var completed : Bool = false
    var percentage : Double = 0.0
    var liquids: Int = 0
}

仅用于CoreData的数据模型类:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
extension NSDayData {

    @nonobjc public class func getDayData() -> NSFetchRequest<NSDayData> {
        let request:NSFetchRequest<NSDayData> = NSDayData.fetchRequest() as! NSFetchRequest<NSDayData>
        
        let sortDescriptor = NSSortDescriptor(key: "date", ascending: true)
        request.sortDescriptors = [sortDescriptor]
        
        return request
    }

    @NSManaged public var completed: Bool
    @NSManaged public var id: UUID?
    @NSManaged public var liquids: Double
    @NSManaged public var percentage: Double
    @NSManaged public var date: Date?

}

extension NSDayData : Identifiable {

}

包含我的列表的代码和onDelete代码的结构:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    struct ListView: View {
        @Environment(\.managedObjectContext) var moc
        @FetchRequest(fetchRequest : NSDayData.getDayData()) var dayItems:FetchedResults<NSDayData>
        @EnvironmentObject var data : DayData
        
    
        var body: some View {
           NavigationView{
    
                        VStack(spacing: 10){
                        HStack{
                                    Text("Date")
                                    Text("Completion")
                                    Text("Liquids")
                                      
                                }.font(.caption)
                            
                            List{
                              ForEach(dayItems, id: \.id) { collection in
                                HStack{
    
                                        Text("\(collection.date?.string(format: self.dateFormat) ?? Date().string(format: self.dateFormat))")
                             
    
                                        Text(collection.percentage > 0.95 ? "100%" : "\(Int(collection.percentage * 100))")
    
                                   
                                        Text("\(Int(collection.liquids))oz")
                                
                                    
                                }.font(.system(size: 10, weight: .light))
                          
     
                              }.onDelete{ (index) in
                                    let db = Firestore.firestore()
                                
                                    db.collection("keanu")
                                        .document(self.data.allData[index.last!].id!)
                                        .delete { (err) in
    
                                        if err != nil{
    
                                            print((err?.localizedDescription)!)
                                            return
                                        }
    
                                    }
                                    self.deleteItems(at: index)
                              }
                        }
                    }
func deleteItems(at offsets: IndexSet) {
        withAnimation{
            offsets.map { dayItems[$0] }.forEach(moc.delete)
            saveMoc()
            data.allData.remove(atOffsets: offsets)
        }
    }

我有另一个视图,我在其中添加新数据并将其保存到Firebase和CoreData,如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
if self.newCollection {
                let dayData = NSDayData(context: self.moc)
                dayData.id = UUID()
                dayData.date = self.data.date
                dayData.completed = self.data.percentage > 0.95
                dayData.percentage = self.data.percentage
                dayData.liquids = self.data.liquids

                do {
                    try moc.save()
                } catch {
                    let error = error as NSError
                    fatalError("Unresolved Error: \(error)")
                }
                
                let db = Firestore.firestore()
                db.collection("keanu").document()
                    .setData(
                        [
                        "date": self.data.date,
                         "completed": self.data.percentage > 0.95,
                         "percentage": self.data.percentage,
                         "liquids": self.data.liquids
                        ]) { (err) in
                        
                        if err != nil{
                            
                            print((err?.localizedDescription)!)
                            return
                        }
                
                    }
EN

回答 1

Stack Overflow用户

发布于 2020-12-10 17:02:17

好了,在youtube上看了kavsoft的一些很棒的视频后,我终于找到了答案。对于那些可能遇到类似问题的人,这是我的解决方案:

  1. 请勿在ForEach上使用onDelete{}函数。而是创建一个删除项目的按钮,这样您就不必处理索引了。

  1. 如果使用CoreData和Firebase,请创建一个字符串变量,该变量将同时等同于结构和核心数据类(请参见下文)。

  1. 在编辑视图(添加新视图等)中,我创建了以下内容:

@Binding var docID: String

状态在列表视图中,为docID的绑定变量创建@

@State var docID = ""

然后,当我从我的列表中显示编辑视图时,它显示如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
   .sheet(isPresented: $show, content: {
                EditView(docID: $docID, show: self.$show newEntry: true)
                 
                        .environment(\.managedObjectContext, self.moc)
                 })

  1. I添加了一个按钮,可以同时从Firebase、CoreData和列表中删除条目。它嵌套在ForEach中,因此在列表中的每一项旁边都会有一个“减号”:

if self.remove{ VStack{ VStack(action:{ let db = Firestore.firestore() db.collection("myCollection").document(docID).delete() moc.delete(moc.delete) saveMoc() } }) {VStack(systemName:"minus.circle.fill") }.buttonStyle(BorderlessButtonStyle()) }

5.2。我还有一个导航栏按钮,可以触发"-“符号出现

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var deleteButton : some View {
        Button(action: {
            
            self.remove.toggle()
            
        }) {
           
            Image(systemName: self.remove ? "xmark.circle" : 
    "trash")
                
        }

  1. 最后,在保存条目时,我设置了CoreData属性:

让dayData = NSDayData(context: self.moc) dayData.id = self.docID

Firebase属性:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
let db = Firestore.firestore()
                db.collection("yourCollection").document(self.docID)
                    .setData(
                        [
                         "id": self.docID,
...
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65234642

复制
相关文章
Google 的 Firebase 如何删除项目
https://www.ossez.com/t/google-firebase/13792
HoneyMoose
2021/11/02
3.2K0
Google 的 Firebase 如何删除项目
Python - 从字典列表中删除字典
字典是python的一个非常常用的功能,用于根据用户需要在其中存储数据。另一个典型的过程涉及编辑或操作此数据。要成为一名高效且快速的程序员,您必须弄清楚如何从字典列表中删除字典。有许多技术可以从词典列表中删除字典,本文将介绍这些技术。
很酷的站长
2023/08/11
2100
Python - 从字典列表中删除字典
vue删除数组中某一元素_数组索引超出范围
在前端开发中,我们经常需要对数组进行操作,增删改是经常的事情,那我们js中该如何删除指定的下标元素呢????
全栈程序员站长
2022/09/22
1.7K0
vue删除数组中某一元素_数组索引超出范围
如何从 Python 列表中删除所有出现的元素?
在 Python 中,列表是一种非常常见且强大的数据类型。但有时候,我们需要从一个列表中删除特定元素,尤其是当这个元素出现多次时。本文将介绍如何使用简单而又有效的方法,从 Python 列表中删除所有出现的元素。
网络技术联盟站
2023/06/01
12.4K0
CAD 2020 安装时出现“安装错误1603:安装过程中的致命错误”
错误1603是Microsoft Windows Installer(MSI)生成的一般错误。此错误倾向于与系统相关,而不是与特定软件相关联。以下是1603错误的常见示例:
知识兔下载
2023/01/31
9.3K0
如何从 Python 中的字符串列表中删除特殊字符?
在进行字符串处理和文本分析时,有时我们需要从字符串列表中删除特殊字符。特殊字符可能是空格、标点符号、换行符等,在某些情况下它们可能干扰我们的文本处理或分析任务。Python 提供了多种方法来删除字符串列表中的特殊字符。本文将详细介绍在 Python 中删除字符串列表中特殊字符的几种常用方法,并提供示例代码帮助你理解和应用这些方法。
网络技术联盟站
2023/06/01
8.3K0
【说站】python迭代中删除列表项目
2、通过分配给slice somelist[:],改变现有列表以仅包含想要的项目。
很酷的站长
2022/11/24
1.6K0
【说站】python迭代中删除列表项目
【leetcode刷题】T103-从分类列表中删除重复项目 II
使用两个指针pre和cur,pre始终指向链表前一部分非重复元素的最后一个节点,cur指向pre指向的节点后重复元素的最后一个节点。当pre->next == cur时,说明cur->val是唯一元素,不用删除,否则pre->next = cur->next。
木又AI帮
2019/07/17
2.3K0
Python - 删除列表中的重复字典
Python 是一个非常广泛使用的平台,用于 Web 开发、数据科学、机器学习以及自动化执行不同的过程。我们可以将数据存储在python中,以不同的数据类型,例如列表,字典,数据集。python字典中的数据和信息可以根据我们的选择进行编辑和更改
很酷的站长
2023/08/11
3211
Python - 删除列表中的重复字典
python中删除列表中重复元素
在面试中,很可能遇到给定一个含有重复元素的列表,删除其中重复的元素,下边给出三种方法来实现这个功能。
全栈程序员站长
2022/09/07
4.1K0
SwiftUI 中的Stack
就从Stack说起,stack查看文档我们看到HVZ三种stack,那么分别是怎么用的呢?
大话swift
2019/07/03
2.3K0
SwiftUI 中的Stack
学习Java时应避免的10个致命错误
要编码还是不编码?看来您已经选择了第一个选项。编程是专业发展的绝佳领域,它使您有机会参与有趣的项目并在任何需要的地方工作。
可大可小
2020/04/07
5450
MySQL中索引创建错误的场景
从这个提示,可以知道是给T表的reg_code字段创建一个BTREE索引,而这个reg_code列的字段类型是BLOB或TEXT,错误信息说的是需要在键的说明中有长度定义,这是什么意思?
bisal
2023/09/21
3140
MySQL中索引创建错误的场景
从用SwiftUI搭建项目说起
后续这个SwiftUI分类的文章全部都是针对SwiftUI的日常学习和理解写的,自己利用Swift写的第二个项目也顺利上线后续的需求也不是特着急,最近正好有空就利用这段时间补一下自己对SwiftUI的理解,这个过程当中正好把整个学习过程记录下来,方便自己查阅,也希望能给需要的同学一点点的帮助。由于自己还欠着RxSwift的帐,这次也是想着先放弃别的账务(欠的的确挺多的)先全心全意的把这两块的帐给补补,希望补上这笔账之后自己对Swift的理解也能上一个台阶,对Siwft的理解自认为还是感觉欠缺的,不算是真的深入的掌握,我对SwiftUI也是在学习当中,现在能查阅的关于SwiftUI的资料很多是需要收费的,遇到问题只能想办法努力解决,有写的不钟意的地方,希望多加指正!
Mr.RisingSun
2020/12/16
4.5K0
从用SwiftUI搭建项目说起
Python中如何获取列表中重复元素的索引?
昨天分享了一个文章,Python中如何获取列表中重复元素的索引?,后来【瑜亮老师】看到文章之后,又提供了一个健壮性更强的代码出来,这里拿出来给大家分享下,一起学习交流。
前端皮皮
2022/08/17
13.4K0
Python中如何获取列表中重复元素的索引?
BUG-索引超出范围
小心一点 System.ArgumentOutOfRangeException:“Index was out of range. Must be non-negative and less than the size of the collection.”
用户9857551
2022/06/28
1.4K0
BUG-索引超出范围
Confluence 6 尝试从 XML 备份中恢复时解决错误
错误可能是因为数据库突然不可访问而产生。也有可能是你备份文件有问题,你需要找到你 XML 备份文件中违反数据库规定的记录修改这个记录后再创建一个新的 XML 备份:
HoneyMoose
2019/01/31
9280
从DataFrame中删除列
在操作数据的时候,DataFrame对象中删除一个或多个列是常见的操作,并且实现方法较多,然而这中间有很多细节值得关注。
老齐
2021/03/29
7K0
一日一技:使用切片从列表中删除元素
列表的切片操作相信大家都已经非常熟悉了。例如有一个列表: [1,2,3,4,5,6,7,8,9,0]
青南
2019/05/14
3.6K0
SwiftUI 中布局的工作原理
在这个技术项目中,我们将探讨 SwiftUI 如何处理布局。有些事情已经解释过了,有些可能是你自己弄明白的,但更多的是你在这一点上想当然的事情,所以我希望一个详细的探索能真正为 SwiftUI 的工作方式提供一些启示。
Swift社区
2021/11/26
3.8K0
SwiftUI 中布局的工作原理

相似问题

从数组中删除-致命错误:超出范围的索引- SwiftUI绑定

12

SwiftUI -从数组中删除项导致致命错误:索引超出范围

132

致命错误: SwiftUI中超出范围的索引

26

SwiftUI -从列表崩溃中删除带有致命错误的项:超出范围的索引

20

线程1:致命错误: SwiftUI中超出范围的索引

24
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文