【问题标题】:Can’t pass data correctly to modal presentation using ForEach and CoreData in SwiftUI无法在 SwiftUI 中使用 ForEach 和 CoreData 将数据正确传递给模态演示
【发布时间】:2025-12-05 23:00:01
【问题描述】:

我试图将某些对象的数据从对象列表传递到模式表,从 CoreData 获取数据。

问题是,无论我在列表中单击什么对象,在详细信息视图中都只会出现上次添加对象的数据表单。

删除对象也是如此——无论我要删除什么对象,最后一个对象都会一直被删除。

使用 NavigationLink 问题消失了,但它不适合我。

这是我的代码:

import SwiftUI

struct CarScrollView: View {

    @Environment(\.managedObjectContext) var moc
    @FetchRequest(entity: Cars.entity(), sortDescriptors: []) var cars: FetchedResults<Cars>

    @State var showDetails = false

    var body: some View {
        VStack {
            ScrollView (.vertical, showsIndicators: false) {
                ForEach (cars, id: \.self) { car in

                    Text("\(car.text!)")
                        .onTapGesture {
                            self.showDetails.toggle()
                    }
                    .sheet(isPresented: self.$showDetails) { CarDetail(id: car.id, text: car.text)
                    }
                }
            }
        }
    }
}

【问题讨论】:

    标签: ios swift core-data swiftui swiftui-list


    【解决方案1】:

    视图堆栈中应该只有一张,所以只需将其移出ForEach,如下所示

    struct CarScrollView: View {
    
        @Environment(\.managedObjectContext) var moc
        @FetchRequest(entity: Cars.entity(), sortDescriptors: []) var cars: FetchedResults<Cars>
    
        @State private var selectedCar: Car? = nil
    
        var body: some View {
            VStack {
                ScrollView (.vertical, showsIndicators: false) {
                    ForEach (cars, id: \.self) { car in
    
                        Text("\(car.text!)")
                            .onTapGesture {
                                self.selectedCar = car
                        }
                    }
                }
            }
            .sheet(item: self.$selectedCar) { car in
                 CarDetail(id: car.id, text: car.text)
            }
    
        }
    }
    

    【讨论】:

    • 感谢您的意见,Asperi!但是它给了我一个错误“实例方法'sheet(item:onDismiss:content:)'要求'Cars'符合'Identifiable'”。有什么想法可以解决这个问题吗?
    • @anton,加空extension Car: Identifiable {},因为Car已经有id了。