Her biri için silme btn'si olan bir forEach döngüsündeki bir öğeyi silme. Swiftuı'yi çekirdek verilerle kullanıyorum

0

Soru

Eğer anlamıyorsan işte kod

struct cartView: View {
        @Environment(\.managedObjectContext) private var viewContext
    
        @FetchRequest(
            sortDescriptors: [], animation: .default) private var products: FetchedResults<Prod>
        
        let columns = [GridItem(.flexible()), GridItem(.flexible())]
        @State var indx = 0
    
        var body: some View {
            NavigationView {
                ScrollView {
                    VStack {
                        LazyVGrid(columns: columns) {
                            ForEach(products, id: \.self) {prod in
                                let prodItems = Product(name: prod.name ?? "Undefined", price: prod.price ?? "Undefined", type: "type", brand: prod.brand ?? "Undefined", images: [prod.image!,""])
                                
                                    ZStack {
                                    Cells(product: prodItems)
                                    // I want the button below delete the item of the 
                                    // button pressed with the function below
                                    Button(action: {}) {
                                        Image(systemName: "xmark.bin.circle")
                                            .resizable()
                                            .frame(width: 30, height: 30)
                                            .foregroundColor(.red)
                                            .background(.black)
                                            .clipShape(RoundedRectangle(cornerRadius: 20))
                                            .offset(x: 60, y: 45)
                                    }
                                }
                            }
                        }
                    }
                }
                .navigationTitle("Cart")
            }
        }
        
        private func deleteItems(offsets: IndexSet) {
            withAnimation {
                offsets.map { products[$0] }.forEach(viewContext.delete)
    
                do {
                    try viewContext.save()
                } catch {
                    let nsError = error as NSError
                    fatalError("Unresolved error \(nsError), \(nsError.userInfo)")
                }
            }
        }
}

yani buradaki soru, kullanıcının düğmeye bastığı öğeyi silmek için forEach döngüsündeki düğmedir ve bunu nasıl yapacağımı biliyorum, ancak bilmediğim şey, öğenin dizinini nasıl alacağımı ve işlevde nasıl geçireceğidir.

core-data swift swiftui
2021-11-14 09:37:14
1

En iyi cevabı

0

Döngünüzün içinden delete yönergesini yayınlıyorsanız, aslında dizine ihtiyacınız yoktur. NSManagedObjectContext örneğin bir delete(_:) nesnenin kendisini alan yöntem. Bu değişim sizin aracılığınızla yayılacak. @FetchRequest nesne otomatik olarak, SwiftUİ görünümünüz koleksiyonu artık silinmiş nesne olmadan gösterecek şekilde güncellenir.

Böylece düğme eyleminiz olur:

Button(action: {
  viewContext.delete(prod)
}) {
  Image(systemName: ...)
  // etc.
}

Efekti hemen görmenize rağmen, silme işleminin yalnızca siz arayana kadar bellekte olacağını unutmayın save yönetilen nesne bağlamında.

CoreData uygulamalarımda, örneğin uygulama arka plana gitmek üzereyken değişikliklerimi ayrı ayrı kaydetme eğilimindeyim. Ancak, nesne kaldırıldıktan hemen sonra bir kaydetmeyi tetiklemek istiyorsanız, bu yeterince basittir:

Button(action: {
  viewContext.delete(prod)
  try? viewContext.save()
}) {
  Image(systemName: ...)
  // etc.
}

Not: belgeler için NSManagedObjectContext.save() kontrol etmen gerektiğini söylüyor. hasChanges kaydetmeye çalışmadan önce özellik, ancak yukarıdaki satırda bir değişiklik yaptığınız için, bu özel örnekte bu gerekli değildir.

2021-11-14 16:37:10

çok teşekkürler, İşe yarıyor, bana gerçekten yardım ettin!
Fovu

Diğer dillerde

Bu sayfa diğer dillerde

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................