【发布时间】:2019-12-27 13:39:57
【问题描述】:
我正在使用 SwiftUI 和 CoreData 为 iOS 编写应用程序。我正在尝试解决一个问题几天。如何根据用户输入在 SwiftUI 中使用动态变化的谓词制作动态过滤器?
我已经按照这个教程学习了动态过滤器和CoreData:https://www.hackingwithswift.com/quick-start/ios-swiftui/dynamically-filtering-fetchrequest-with-swiftui
经过一些小改动后,我得到了以下代码。 ContentView.swift:
import SwiftUI
struct ContentView: View {
@Environment(\.managedObjectContext) var moc
@State var lastNameFilter = "A"
var body: some View {
VStack {
FilteredList(predicate: lastNameFilter)
Button("Add Examples") {
let taylor = Singer(context: self.moc)
taylor.firstName = "Taylor"
taylor.lastName = "Swift"
let ed = Singer(context: self.moc)
ed.firstName = "Ed"
ed.lastName = "Sheeran"
let adele = Singer(context: self.moc)
adele.firstName = "Adele"
adele.lastName = "Adkins"
try? self.moc.save()
}
Button("Show A") {
self.lastNameFilter = "A"
}
Button("Show S") {
self.lastNameFilter = "S"
}
}
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
FilteredList.swift:
import CoreData
import SwiftUI
struct FilteredList: View {
var predicate:String
var fetchRequest: FetchRequest<Singer>
var singers: FetchedResults<Singer>{fetchRequest.wrappedValue}
var body: some View {
List(singers, id: \.self) { singer in
Text("\(singer.firstName ?? "Unknown") \(singer.lastName ?? "Unknown")")
}
}
init(predicate: String) {
self.predicate = predicate
self.fetchRequest = FetchRequest<Singer>(entity: Singer.entity(), sortDescriptors: [], predicate: NSPredicate(format: "lastName BEGINSWITH %@", predicate))
}
}
//struct FilteredList_Previews: PreviewProvider {
// static var previews: some View {
// }
//}
我还有一个名为 Singer 的实体,该实体有 2 个属性:firstName 和 lastName,它们都是字符串。 上面的示例在模拟器中似乎可以正常工作,但在 Xcode 中使用 Preview 时会导致应用崩溃。
我将不胜感激,例如:
- 指出要更改示例代码的哪一部分以避免预览中的错误
- 在 SwiftUI 中使用动态谓词的另一种方式的简单示例
- 链接到有关 SwiftUI 中的动态过滤器的教程
【问题讨论】:
标签: ios swift xcode core-data swiftui