Search 搜索文本在谓词SwiftUI中没有响应
searchText更改不会更改谓词输入,因此无论我在搜索栏中键入什么,我都会在核心数据中获得所有提醒 我希望我的列表根据搜索栏中键入的文本进行更改 这是我的搜索视图Search 搜索文本在谓词SwiftUI中没有响应,search,swiftui,nspredicate,Search,Swiftui,Nspredicate,searchText更改不会更改谓词输入,因此无论我在搜索栏中键入什么,我都会在核心数据中获得所有提醒 我希望我的列表根据搜索栏中键入的文本进行更改 这是我的搜索视图 struct SearchView: View { @Environment(\.managedObjectContext) private var viewContext @FetchRequest var reminder: FetchedResults<CDReminder> @State
struct SearchView: View {
@Environment(\.managedObjectContext) private var viewContext
@FetchRequest var reminder: FetchedResults<CDReminder>
@State var searchText: String = ""
init(searchText: State<String>) {
self._searchText = searchText
var predicate : NSPredicate?
if !self._searchText.wrappedValue.isEmpty{
predicate = NSPredicate(format: "name CONTAINS %@", self._searchText.wrappedValue)
}
self._reminder = FetchRequest(
entity: CDReminder.entity(),
sortDescriptors: [],
predicate: predicate
)
}
var body: some View {
VStack {
SearchBar(text: searchText)
List {
ForEach(self._reminder.wrappedValue.filter({
self.searchText.isEmpty ? true :
$0.notes!.localizedCaseInsensitiveContains(self.searchText)
}), id: \.self){ reminder in
DatedReminderCell(reminder: reminder, isSelected: false,
onComplete: {})
}
}
}
}
}
我创建了另一个名为FilteredList的视图。在这个视图中,我获取了所有的提醒,然后用谓词过滤它们
import SwiftUI
import CoreData
struct FilteredList: View {
var fetchRequest: FetchRequest<CDReminder>
var reminders: FetchedResults<CDReminder> {fetchRequest.wrappedValue}
var body: some View {
List(fetchRequest.wrappedValue , id: \.self) { reminder in
DatedReminderCell(reminder: reminder, isSelected: false, onComplete: {})
}
}
init(filter: String) {
fetchRequest = FetchRequest<CDReminder>(
entity: CDReminder.entity(),
sortDescriptors: [],
predicate: NSPredicate(format: "title CONTAINS %@", filter.lowercased())
)
}
}
所以现在,当我在搜索栏中输入文本时,我会同时看到相关的提醒。SearchView和SearchBar没有绑定“searchText”属性。因此,SearchView不知道您在SearchBar中键入的内容。此外,如果您绑定它们,您仍然需要在“SearchView”中发出新的获取请求要获取更新的结果,将不会再次调用init()。
import SwiftUI
import CoreData
struct FilteredList: View {
var fetchRequest: FetchRequest<CDReminder>
var reminders: FetchedResults<CDReminder> {fetchRequest.wrappedValue}
var body: some View {
List(fetchRequest.wrappedValue , id: \.self) { reminder in
DatedReminderCell(reminder: reminder, isSelected: false, onComplete: {})
}
}
init(filter: String) {
fetchRequest = FetchRequest<CDReminder>(
entity: CDReminder.entity(),
sortDescriptors: [],
predicate: NSPredicate(format: "title CONTAINS %@", filter.lowercased())
)
}
}
var body: some View {
VStack{
SearchBar(text: $searchText)
.environment(\.managedObjectContext, viewContext)
FilteredList(filter: searchText)
}
}