【问题标题】:Delete data from CoreData从 CoreData 中删除数据
【发布时间】:2021-09-23 06:38:26
【问题描述】:

我想马上说我是 Swift 新手。我的任务是通过单击按钮删除某些数据 附:单击按钮并删除“框架”,如何为此重写函数 (在 SwiftUI、AppDelegate 中工作)

//MARK: - PROPERTIES

    @FetchRequest(entity: TodoDB.entity(), sortDescriptors: [NSSortDescriptor(keyPath: \TodoDB.name, ascending: true)]) var manyTasksTodo: FetchedResults<TodoDB>

实现了删除功能,但是在按钮动作中调用该功能时出现错误

//MARK: - FUNCTION

    public func deleteTodo(at offsets: IndexSet){
        for index in offsets{
            let todoDB = manyTasksTodo[index]
            managedObjectContext.delete(todoDB)
            do{
                try managedObjectContext.save()
            } catch{
                print(error)
            }
        }
    }

完整代码:

import SwiftUI

struct ContentView: View {
    //MARK: - PROPERTIES
    
    @Environment(\.managedObjectContext) var managedObjectContext
    
    @FetchRequest(entity: TodoDB.entity(), sortDescriptors: [NSSortDescriptor(keyPath: \TodoDB.name, ascending: true)]) var manyTasksTodo: FetchedResults<TodoDB>
    
    @State public var AddTodo: Bool = false
    @State private var animationButton: Bool = false
    
    @Namespace var animationID
    
    //MARK: - BODY
    var body: some View {
            
        ScrollView(.vertical, showsIndicators: false){
            VStack{
                    ForEach(self.manyTasksTodo, id: \.self) { (todoDB: TodoDB) in

                        VStack(alignment: .leading, spacing: 5){
                            
                            ZStack{
                                Button(action: {
                                    
                                }, label: {
                                    Image(systemName: "trash")
                                        .frame(maxWidth: .infinity, alignment: .bottomTrailing)
                                        .padding(.bottom,30)
                                        .foregroundColor(.black)
                                })
                                
                            Divider()
                                
                                Text(todoDB.attribute ?? "unknown attribute")
                                    .foregroundColor(.black)
                                    .font(.callout)
                                    .padding(.bottom, 30)
                            }
                            Text(todoDB.name ?? "unknown task")
                                .foregroundColor(.black)
                                .padding(.bottom)
                            
                            
                            Text(todoDB.date ?? Date(), style: .date)
                                .foregroundColor(.black)
                                .font(.callout)
                                

                            HStack{     
                            Spacer() 
                            }
                        
                        }//VStack
                        .padding()
                        .background(Color("Red"))
                        .cornerRadius(10)
                        .padding()
                        
                    }//: FOREACH
                    
                    .onDelete(perform: deleteTodo(at:))
                    
                Spacer()

            }
            .shadow(color: Color.black.opacity(0.3), radius: 10, x: 0, y: 10)
            .shadow(color: Color.black.opacity(0.2), radius: 5, x: 0, y: 2)
        }
        .padding(.top, 45)
        .background(Color("Bg"))
        .edgesIgnoringSafeArea(.all)
        

            .overlay(
                ZStack{
                    Group{
                        Circle()
                            .fill(Color.black)
                            .opacity(self.animationButton ? 0.2 : 0)
                            .scaleEffect(self.animationButton ? 1 : 0)
                            .frame(width: 68, height: 68, alignment: .center)
                        Circle()
                            .fill(Color.black)
                            .opacity(self.animationButton ? 0.15 : 0)
                            .scaleEffect(self.animationButton ? 1 : 0)
                            .frame(width: 88, height: 88, alignment: .center)
                    }
                    .animation(Animation.easeInOut(duration: 2).repeatForever(autoreverses: true), value: self.animationButton)

                Button(action: {
                    self.AddTodo.toggle()

                }, label: {
                    Image(systemName: "plus.circle.fill")
                        .resizable()
                        .scaledToFit()
                        .background(Circle().fill(Color.white))
                        .foregroundColor(Color.black)
                        .frame(width: 48, height: 48, alignment: .center)
                    })

                .sheet(isPresented: $AddTodo){
                    AddTodoView().environment(\.managedObjectContext, self.managedObjectContext)}
                .onAppear(perform: {
                    self.animationButton.toggle()
                })

                }//: ZSTACK
                .padding(.bottom, 15)
                .padding(.trailing, 15)
                , alignment: .bottomTrailing
                )
            
        //}//: NAVIGATON
}
        
    
    
    //MARK: - FUNCTION
    
    public func deleteTodo(at offsets: IndexSet){
        for index in offsets{
            let todoDB = manyTasksTodo[index]
            managedObjectContext.delete(todoDB)
            do{
                try managedObjectContext.save()
            } catch{
                print(error)
            }
        }
    }
}

    //MARK: - PREIVIEW
struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        let context  = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
        return ContentView()
            .environment(\.managedObjectContext, context)
    }
}

【问题讨论】:

  • 错误是什么?可能是它没有得到 IndexSet,因为它来自内置的 ForEach 修饰符。更改要接收的函数(todoDB:TodoDB)作为参数
  • 我只是想知道如何重写函数

标签: ios swift xcode


【解决方案1】:

IndexSet 方法在您将 onDeleteForEach 循环一起使用时有效。

由于您无法使用Button 访问IndexSet,因此您传递了实际项目。

把你的函数改成这个。

public func deleteTodo(todoDB: TodoDB){
        managedObjectContext.delete(todoDB)
        do{
            try managedObjectContext.save()
        } catch{
            print(error)
        }
}

然后像这样把这段代码放在垃圾桶按钮的操作中。

deleteTodo(todoDB: todoDB)

【讨论】:

    猜你喜欢
    • 2014-11-20
    • 1970-01-01
    • 2011-06-24
    • 1970-01-01
    • 1970-01-01
    • 2013-08-15
    • 2011-11-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多