用SwiftUI的@FetchRequest构建动态列表
2023-11-26 08:05:40
导言
在SwiftUI 100天系列的第6部分中,我们探索了如何使用@FetchRequest
从Core Data中获取数据并将其显示在界面上。在本文中,我们将深入了解@FetchRequest
的使用,并构建一个动态列表,以显示图书的标题、评级和作者信息。
使用@FetchRequest
@FetchRequest
是一个属性包装器,允许我们从Core Data中获取数据并将其绑定到SwiftUI视图。它使用一个FetchRequest
结构体来指定要获取的数据,包括实体类型、排序和谓词。
要使用@FetchRequest
,我们首先需要创建一个FetchRequest
结构体:
struct FetchRequest<Entity: NSManagedObject>: View {
let request: NSFetchRequest<Entity>
var body: some View {
List(request.wrappedValue) { item in
Text(item.name)
}
}
}
在这个例子中,FetchRequest
结构体获取Entity
类型的实体,其中Entity
是遵循NSManagedObject
协议的Core Data实体。request
属性是一个NSFetchRequest
对象,它指定要获取的数据。body
属性是一个列表,它显示了request
中的实体列表。
接下来,我们可以将@FetchRequest
属性包装器添加到我们的视图中:
struct BookwormListView: View {
@FetchRequest(entity: Book.entity(), sortDescriptors: [NSSortDescriptor(keyPath: \Book.title, ascending: true)])
var books: FetchedResults<Book>
var body: some View {
List(books) { book in
Text(book.title ?? "")
}
}
}
在这个例子中,@FetchRequest
属性包装器获取Book
实体,并按title
属性升序排序。books
属性是一个FetchedResults
对象,它包含获取的实体列表。body
属性是一个列表,它显示了books
中的图书列表。
构建动态列表
现在,让我们扩展我们的BookwormListView
以显示图书的评级和作者信息。我们可以通过修改body
属性来实现:
struct BookwormListView: View {
@FetchRequest(entity: Book.entity(), sortDescriptors: [NSSortDescriptor(keyPath: \Book.title, ascending: true)])
var books: FetchedResults<Book>
var body: some View {
List(books) { book in
HStack {
Text(book.title ?? "")
Spacer()
HStack {
Image(systemName: "star.fill")
.foregroundColor(.yellow)
Text("\(book.rating)")
}
}
}
}
}
在这个例子中,我们在每个列表行中添加了一个HStack
,它包含图书的标题、一个间距和一个HStack
,其中包含一个星形填充符号(表示评级)和图书的评级文本。
结论
@FetchRequest
是一个强大的工具,用于从Core Data中获取数据并将其显示在SwiftUI界面上。通过使用@FetchRequest
,我们可以轻松地构建动态列表,这些列表会自动更新,反映Core Data中数据的任何更改。