onDelete 附加到 ForEach 但没有滑动手势

Posted

技术标签:

【中文标题】onDelete 附加到 ForEach 但没有滑动手势【英文标题】:onDelete is attached to ForEach but there's no swipe gestures 【发布时间】:2021-06-21 14:14:49 【问题描述】:

将 .onDelete() 附加到 ForEach 后,什么也不会发生 - 无法滑动删除,点击编辑也不会显示任何内容。不知道我做错了什么。它在模拟器和我的 iPhone (ios 14.5) 上编译得很好这是我的实际代码。

NavigationView 
    List 
          ForEach(medicines)  medicine in
               HStack 
                    VStack(alignment: .leading) 
                          Text("\(medicine.name!) \(medicine.strength) \(medicine.unit!)" as String)
                             .font(.headline)
                          Text("\(medicine.quantity) x \(medicine.form!) \(medicine.direction!)" as String)
                             .font(.subheadline)
                    
                
                .frame(height: 50)
            
            .onDelete(perform: deleteMedicines)
            .listStyle(PlainListStyle())
            .navigationBarTitle("Medicines")
            .navigationBarItems(leading: EditButton(), trailing: Button(action: 
                 self.showingAddScreen.toggle()
            ) 
                 Image(systemName: "plus")
            )
            .sheet(isPresented: $showingAddScreen) 
                 AddMedicineView().environment(\.managedObjectContext, self.viewContext)
            
        
    

然后是 deleteMedicines() 函数:

    private func deleteMedicines(offsets: IndexSet) 
        withAnimation 
            offsets.map  medicines[$0] .forEach(viewContext.delete)
            do 
                try viewContext.save()
             catch 
                // Replace this implementation with code to handle the error appropriately.
                // fatalError() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.
                let nsError = error as NSError
                fatalError("Unresolved error \(nsError), \(nsError.userInfo)")
            
        
    

我已经看到了几种不同的方法,并且我尝试了一些。当我第一次玩 List 时,我就让它工作了。 deleteMedicines 代码是从 Core Data 的 Xcode 模板中借用的。感谢您提前提供任何帮助。

【问题讨论】:

【参考方案1】:

提供的代码不可测试,但请尝试仅在 ForEach 上保留 onDelete 修饰符,其他所有内容移至 List(修饰符的放置很重要,可能是您的问题的原因),例如

NavigationView 
    List 
          ForEach(medicines)  medicine in
               // content here
          
          .onDelete(perform: deleteMedicines)   // << here !!
    
    .listStyle(PlainListStyle())
    .navigationBarTitle("Medicines")
    .navigationBarItems(leading: EditButton(), trailing: Button(action: 
         self.showingAddScreen.toggle()
    ) 
         Image(systemName: "plus")
    )
    .sheet(isPresented: $showingAddScreen) 
         AddMedicineView().environment(\.managedObjectContext, self.viewContext)


【讨论】:

谢谢。我开始认为我以某种方式制作了一个静态列表,但您的解决方案非常完美。

以上是关于onDelete 附加到 ForEach 但没有滑动手势的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 .reversed() 处理 SwiftUI 列表数组的 .onDelete

Swiftui foreach 索引超出范围 ondelete 问题

SwiftUI .onDelete 从 ForEach 获取 var

SwiftUI ForEach.onDelete 在 TabView 中无法正常工作

。onDelete在排序的ForEach中不起作用-SwiftUI

SwiftUI .onDelete 抛出致命错误:索引超出范围