ios - 从 SwiftUI 上的部分列表中删除项目
问题描述
概述
我正在做一个带有核心数据的简单应用程序我有两个实体用户和区域该应用程序按区域显示用户列表问题是在删除操作中,如果我尝试删除第二个部分,则列表从第一部分中删除用户用户从第二部分删除第二个用户从第一部分。
我认为索引集在发送该部分的索引时出错,但是当我尝试将 onDelete 更改为我的嵌套 forEach 时不起作用
这是代码
import SwiftUI
struct ContentView: View {
@Environment(\.managedObjectContext) var moc
@FetchRequest(entity: User.entity(), sortDescriptors: [NSSortDescriptor(keyPath: \User.name, ascending: true)]) var users: FetchedResults<User>
@FetchRequest(entity: Territory.entity(), sortDescriptors: [NSSortDescriptor(keyPath: \Territory.name, ascending: true)]) var territories: FetchedResults<Territory>
@State private var showAddUser = false
var body: some View {
GeometryReader{ geometry in
NavigationView {
ZStack {
List {
ForEach(self.territories, id: \.self) { territorie in
Section(header: Text(territorie.wrappedName)) {
ForEach(territorie.usersArray, id: \.self) { user in
NavigationLink(destination: UserView(user: user)) {
VStack{
HStack{
Text("user")
Spacer()
Text(user.dayLastVisit)
.padding(.horizontal)
}
HStack {
Text(user.wrappedEmoji)
.font(.largeTitle)
VStack(alignment: .leading) {
Text("\(user.wrappedName + " " + user.wrappedLastName)")
.font(.headline)
Text(user.wrappedType)
}
Spacer()
}
}
}
}.onDelete(perform: self.deleteItem)
}
}
}
.listStyle(GroupedListStyle())
.environment(\.horizontalSizeClass, .regular)
VStack {
Button(action:{ self.showAddRUser.toggle()}){
ButtonPlus(icon:"plus")}
.offset(x: (geometry.size.width * 0.40), y: (geometry.size.height * 0.38))
.sheet(isPresented: self.$showAddUser){
NewUserView().environment(\.managedObjectContext, self.moc)
}
}
}
.navigationBarTitle("Users")
.navigationBarItems( trailing: HStack {
EditButton()
Button(action:{self.showAddUser.toggle()}){
ButtonNew(text:"Nueva")}
}
.sheet(isPresented: self.$showAddUser){
NewUserView().environment(\.managedObjectContext, self.moc)
}
)
}
}
}
func deleteItem(at offsets: IndexSet) {
for offset in offsets {
let user = users[offset]
//borarlo del context
moc.delete(user)
}
try? moc.save()
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
我正在学习 swift 和 swiftui,所以我会很感激任何帮助
解决方案
您需要传入节索引和行索引,以便知道要删除哪个嵌套项。像这样的东西。
.onDelete { self.deleteItem(at: $0, in: sectionIndex) }
并更改您的功能以接受该部分索引:
func deleteItem(at offsets: IndexSet, in: Int)
在您的情况下,您可能可以传入类似territorie.id
部分索引的内容,并使用它来删除正确的项目。或传入territorie
对象 - 获取正确用户所需的任何内容。只有索引不会让你到达那里。希望这一切都有意义!
推荐阅读
- javascript - 如何创建包含 2 年重叠数据的折线图?
- angular - 轮询服务器的 PWA 永远不会更新到较新的版本
- math - jEuclid:如何在带有下标的公式中显示条形图
- unity3d - 如何在 UI 上添加后期处理(Unity)
- python-3.x - 取一部分字符串并与其他位置交换位置
- c# - 无法通过 Graph API 将客人添加到团队
- php - 如何使用baseurl传递参数
- blockchain - 如何在科尔达获得一个州的历史?
- scheme - 将 guile 链接到 Rcpp
- android - 当 tabmode 设置为可滚动时,TabLayout 不填充屏幕宽度