使用 SwiftUI 在 CoreData 中处理 Header / Detail 视图的正确方法

Posted

技术标签:

【中文标题】使用 SwiftUI 在 CoreData 中处理 Header / Detail 视图的正确方法【英文标题】:Correct way of handling Header / Detail views in CoreData with SwiftUI 【发布时间】:2020-12-31 18:04:38 【问题描述】:

我有一个 NavigationView 调用带有标题记录的 NavigationLink,然后应该显示标题信息和详细信息。但是,当我致电我的 FetchRequests 以获取详细信息时,我会收到 Cannot use instance member 'header' within property initializer; property initializers run before 'self' is available - 这是相关代码:

struct ViewDetailsView: View 
    @Environment(\.managedObjectContext) var moc
    @FetchRequest(
        entity: Detail.entity(),
        sortDescriptors: [NSSortDescriptor(keyPath: \Detail.description, ascending: true)],
        predicate: NSPredicate(format: "%K == %@", #keyPath(Detail.header), header)
    ) private var details: FetchedResults<Event>    
    var header: Header
    var body: some View 
        VStack
            Text("\(header.firstName ?? "no first name") \(header.lastName ?? "no last name")")
                .padding()
            List 
                ForEach(details) 
                    detail in
                    Text("\(detail.description ?? "Unknown description")")
                
            
        
    

 

我通过 Headers 视图中的 NavigationLink 调用此视图:

NavigationView 
    List 
        ForEach(headers) 
            header in
            NavigationLink(destination: ViewDetailsView(header: header)) 
                Text("\(header.firstName ?? "no first name") \(header.lastName ?? "no last name")") 
// ADD @FETCHREQUEST for DETAIlS here and pass to ViewDetailsView?
            
        
        .onDelete(perform: deleteHeader)
    

我尝试在上面(注释所在的位置)添加详细信息获取,最终得到与第一个视图(上面的第一个代码段)相同的错误。如何使用 CoreData 正确处理 SwiftUI 中的 Header / Details 挑战,以便在详细信息视图中真正需要它们之前,您不会加载 Header 列表(NavigationView)上的所有详细信息记录

【问题讨论】:

您需要在 init 中传递标头并像在 ***.com/a/59451047/12299030 中一样以编程方式初始化 fetch 请求,也可以在 ***.com/a/59345830/12299030 中提供帮助。 【参考方案1】:

谢谢@Asperi - 这是我正在寻找的帮助.. 这是在详细信息视图中解决的方法 -

    init(header: Header) 
        self.header = header
        let request: NSFetchRequest<Details> = Details.fetchRequest()
        request.sortDescriptors = [NSSortDescriptor(keyPath: \Details.eventDate, ascending: true), NSSortDescriptor(keyPath: \Details.event, ascending: true)]
        request.predicate =  NSPredicate(format: "%K == %@", #keyPath(Details.header), header)
        
        _events = FetchRequest<Event>(fetchRequest: request)
    

【讨论】:

如果你不想重新输入FetchRequest&lt;Event&gt;,你可以直接说_events = .init(fetchRequest: request)

以上是关于使用 SwiftUI 在 CoreData 中处理 Header / Detail 视图的正确方法的主要内容,如果未能解决你的问题,请参考以下文章

如何在 SwiftUI 中使用 CoreData 更改数据值?

在 CoreData 记录中进行更改,SwiftUI

在 EditView 中使用 CoreData 中的值预填充 SwiftUI 表单

SwiftUI 使用 CoreData 从列表中编辑项目

SwiftUI - 使用 CoreData 获取的结果来填充选取器

如何在 SwiftUI 中从 FetchedResults (CoreData) 中获取 NSOrderedSet