Search 搜索文本在谓词SwiftUI中没有响应

Search 搜索文本在谓词SwiftUI中没有响应,search,swiftui,nspredicate,Search,Swiftui,Nspredicate,searchText更改不会更改谓词输入,因此无论我在搜索栏中键入什么,我都会在核心数据中获得所有提醒 我希望我的列表根据搜索栏中键入的文本进行更改 这是我的搜索视图 struct SearchView: View { @Environment(\.managedObjectContext) private var viewContext @FetchRequest var reminder: FetchedResults<CDReminder> @State

searchText更改不会更改谓词输入,因此无论我在搜索栏中键入什么,我都会在核心数据中获得所有提醒

我希望我的列表根据搜索栏中键入的文本进行更改

这是我的搜索视图

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)
    }
}