gpt4 book ai didi

ios - Swift 2.0 .contextMenu 从核心数据中多次删除

转载 作者:行者123 更新时间:2023-12-05 08:05:29 24 4
gpt4 key购买 nike

第一次在这里发帖,对编码还很陌生...所以我希望我遵循正确的协议(protocol)。我在 Xcode 12.2 (SwiftUI 2) 中组合了一个 View ,该 View 从 Core Data 输出数据列表,并有一个上下文菜单为用户提供编辑、删除和删除多个的选项。上下文菜单可以正常编辑和删除,但是,我在如何实现删除多个列表项的功能方面遇到了障碍。我想象用户会用力按下列表项之一,弹出上下文菜单,如果他们按下“删除多个”选项, View 会激活类似于编辑模式的东西,该模式填充每个项目左侧的小圆圈用户一次可以选择和删除多个项目。我可以查看有关如何执行此操作的其他文章,但是,我找不到有关如何通过核心数据实现此操作的指导。我在下面粘贴了我的代码。

如果我遗漏了任何其他可以使我的问题更清楚的信息,请告诉我。

我非常感谢论坛的专业知识和指导。

Struct List : View    {

@StateObject var appData = AppViewModel()
@Environment(\.managedObjectContext) var context

//Fetch Data...
@FetchRequest(entity: EntryData.entity(), sortDescriptors: [NSSortDescriptor(key: "date", ascending: false)], animation: .spring()) var results : FetchedResults<EntryData>

var body : some View {
ZStack(alignment: Alignment(horizontal: .trailing, vertical: .bottom), content: {
VStack{
ScrollView(.vertical, showsIndicators: false, content: {
LazyVStack(alignment: .leading, spacing: 20){
ForEach(results){task in
VStack(alignment: .leading, spacing: 5, content: {
Text(task.category ?? "")
.font(.title)
.fontWeight(.bold)
Text(task.date ?? Date(), style:. date)
.fontWeight(.bold)
Text("\(task.number.formattedCurrencyText)")

})
.padding(.horizontal, 14)
.padding(.top, 10)
.foregroundColor(Color("ColorTextList"))

.contextMenu{
Button(action: {appData.editItem(item: task)}, label: {
Text("Edit")
})
Button(action: {
context.delete(task)
try! context.save()
}, label: {
Text("Delete")
})
Button(action: {}, label: {
Text("Delete Mutiple")
})
}
}

}
})

}
VStack(){
VisualEffectView(effect: UIBlurEffect(style: .regular))
.frame(width: UIScreen.main.bounds.width, height: 50, alignment: .top)
.edgesIgnoringSafeArea(.all)
.background(Color.clear)
Spacer()
}
})
.background(Color.clear)
.sheet(isPresented: $appData.isNewData, content: {
AddDataView(appData: appData)
.environment(\.managedObjectContext, self.context)
})

}
}

添加应用的 viewModel。我如何利用这一点并删除多列表选择中的每个属性?

import SwiftUI
import CoreData

class AppViewModel : ObservableObject, Identifiable{

@Published var cateogry = ""
@Published var date = Date()
@Published var number : Double? = nil
@Published var notes = ""
@Published var id = UUID()
}

并添加实际的 Core Data 模型屏幕截图。

enter image description here

最佳答案

您可以为您的列表实现一个选择集。这将包含所有选定的元素。然后,您可以根据集合的数量动态显示 delete 或 deleteAll 的 contextMenu。这是 deleteAll 实现的完整示例

struct SelectionDemo : View {
@State var demoData = ["Dave", "Tom", "Phillip", "Steve"]
@State var selected = Set<String>()

var body: some View {

HStack {
List(demoData, id: \.self, selection: $selected){ name in
Text(name)
.contextMenu {
Button(action: {
//Delete only one item
}){
Text("Delete")
}
if (selected.count > 1) {
Button(action: {
//Delete all
deleteAll()
})
{
Text("Delete all")
}
}
}
}.frame(width: 500, height: 460)
}
}

func deleteAll() {
for element in selected {
self.demoData.removeAll(where: {
$0 == element
})
}
}
}

关于ios - Swift 2.0 .contextMenu 从核心数据中多次删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64978171/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com