SwiftUI .swipeactions 和核心数据

Posted

技术标签:

【中文标题】SwiftUI .swipeactions 和核心数据【英文标题】:SwiftUI .swipeactions and Core Data 【发布时间】:2021-08-28 13:26:26 【问题描述】:

目前使用 Xcode 13 和 ios 15。

我正在使用 CoreData 显示即将到来的旅行列表。在每次旅行中,我有 2 个滑动操作,一个是删除旅行,第二个是编辑旅行。选择编辑按钮时,我将触发显示的题为true,以便显示EditTripeCreen表。我将这次旅行传递到此表中以进行编辑。问题是,无论从 ForEach 行中选择什么行程,发送到 EditTripScreen 的始终是第一个行程数据。我这样做是否正确,或者是他们的另一种解决方案。 谢谢

ForEach(tripVM.trips, id: \.id)  trip in
                            TripCardView(trip: trip)
                                .listRowSeparator(.hidden)
                                //.padding(.horizontal)
                            
                                .swipeActions(allowsFullSwipe: false) 
                                            // Edit Trip
                                            Button 
                                               showingEditTripScreen = true
                                                
                                             label: 
                                                
                                                Label("Edit", systemImage: "pencil.circle.fill")
                                                    
                                            
                                            
                                            .tint(.green)
                                            
                                            // Delete Trip
                                            Button 
                                                tripVM.deleteTrip(trip: trip)
                                                tripVM.getAllTrips()
                                              
                                             label: 
                                                Label("Delete", systemImage: "trash.circle.fill")
                                                    
                                            
                                            .tint(.red)
                                        
                                .sheet(isPresented: $showingEditTripScreen, onDismiss: 
                                    
                                , content: 
                                    
                                    EditTripScreen(trip: trip)
                                )
    
                        

【问题讨论】:

使用sheet(item:)这是一种已知行为 【参考方案1】:

您正在为表格的每个单元格添加sheet。因此,当您将 showingEditTripScreen 变量设置为 true 时,所有可见视图的工作表都会被触发,并且只会显示其中一个,可能是第一个,也可能只是一个随机的。

相反,您需要存储所选行程并使用sheet(item:onDismiss:content:),这会将您未包装的项目传递给您的内容。而这个sheet 应该是您列表中的一个,而不需要将它添加到每个项目中。

另外onDismiss是一个可选参数,如果你不使用它,你不需要传递它。当您自动将其关闭时,editingTrip 将设置为 nil

@State
var editingTrip: Trip?

var body: some View 
    ForEach(tripVM.trips, id: \.id)  trip in
        TripCardView(trip: trip)
            .listRowSeparator(.hidden)
            //.padding(.horizontal)
            
            .swipeActions(allowsFullSwipe: false) 
                // Edit Trip
                Button 
                    editingTrip = trip
                 label: 
                    
                    Label("Edit", systemImage: "pencil.circle.fill")
                    
                
                
                .tint(.green)
                
                // Delete Trip
                Button 
                    tripVM.deleteTrip(trip: trip)
                    tripVM.getAllTrips()
                    
                 label: 
                    Label("Delete", systemImage: "trash.circle.fill")
                    
                
                .tint(.red)
            
        
    
    .sheet(item: $editingTrip, content:  editingTrip in
        EditTripScreen(trip: editingTrip)
    )

【讨论】:

感谢您的回复。我试过这个,但我在工作表上遇到错误:无法将类型“Binding”的值转换为预期的参数类型“Binding”,在“可选”上引用静态方法“buildBlock”需要“Trip”符合“视图”,并且无法转换“旅行”类型的值?到预期的参数类型“TripViewModel” @diver91 我打错了,请参阅更新的答案 谢谢,但我仍然在工作表上遇到错误。如果您想在我的完整项目中试用,我已将我的项目上传到 GitHub:[link(github.com/diver91/Travelogue) @diver91 你得到了什么确切的错误?这个项目很大,我不想下载和构建。 工作表上的错误与以前相同。以下是这些错误的屏幕截图:icloud.com/iclouddrive/…

以上是关于SwiftUI .swipeactions 和核心数据的主要内容,如果未能解决你的问题,请参考以下文章

为啥 swipeActions 修饰符不能直接与 List 容器一起使用? #SwiftUI

SwiftUI - 核心数据从按钮中删除项目

使用 ForEach 中的 SwiftUI 3.0 .swipeActions,您如何在将 ForEach 的输入参数传递给该视图时让一个动作转到另一个视图?

SwiftUI:按核心数据属性分组和求和

在 macOS 上的 SwiftUI 列表视图中选择和删除核心数据实体

SwiftUI 核心数据