使用 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<Event>
,你可以直接说_events = .init(fetchRequest: request)
以上是关于使用 SwiftUI 在 CoreData 中处理 Header / Detail 视图的正确方法的主要内容,如果未能解决你的问题,请参考以下文章
如何在 SwiftUI 中使用 CoreData 更改数据值?
在 EditView 中使用 CoreData 中的值预填充 SwiftUI 表单