![](/img/trans.png)
[英]Is it possible to make SwiftUI List item text selectively bold for FAQ section?
[英]Delete item from a section list on 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
對象 - 無論你需要什么來獲得正確的用戶。 只有索引不會讓你到達那里。 希望一切都有意義!
因此,感謝找到解決方案的 Kevin Renskers 的幫助。 我只是.onDelete { self.deleteItem(at: $0, in: territorie)}
我的函數中添加了一個.onDelete { self.deleteItem(at: $0, in: territorie)}
然后我使用了來自該領土的相同 arrayUsers。
func deleteItem(at offsets: IndexSet, in ter: Territory) {
for offset in offsets {
let user = ter.usersArray[offset]
moc.delete(user)
}
try? moc.save()
}
對我來說,解決方案如下:
ForEach(self.territories, id: \.self) { territorie in
Section(header: Text(territorie.wrappedName)) {
ForEach(territorie.usersArray, id: \.self) { user in
// your code here
}
.onDelete { indexSet in
for index in indexSet {
moc.delete(territorie[user])
}
// update the view context
moc.save()
}
}
}
indexSet
的index
返回應在該特定部分中刪除的項目。 因此,如果我刪除某個部分的第一項,它會返回 0。
territorie
返回包含在該部分中的所有項目的列表。 因此,使用 territorie[index] 將返回您要刪除的特定用戶對象。
現在我們有了要刪除的對象,我們可以將它傳遞給moc.delete(territorie[index])
。 最后,我們用moc.save()
保存它。
旁注:盡管 Misael 使用了變量 'territorie',但我更喜歡使用變量名section
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.