我是Swift中的核心數據的新手,需要使用NSPredicate的幫助。我目前在我的應用程序中有一個表格視圖和一個搜索欄。我也有一個名爲Item的實體,具有過敏原(字符串)的屬性。我想過濾這個表視圖,以便只有當searchBar.text等於Item.allergen時才顯示單元格。在表視圖中使用NSPredicate對核心數據進行排序(Swift)
func attemptFetch() {
let fetchRequest: NSFetchRequest<Item> = Item.fetchRequest()
let dateSort = NSSortDescriptor(key: "created", ascending: false)
let titleSort = NSSortDescriptor(key: "title", ascending: true)
if segment.selectedSegmentIndex == 0 {
fetchRequest.sortDescriptors = [dateSort]
} else if segment.selectedSegmentIndex == 1 {
fetchRequest.sortDescriptors = [titleSort]
} else {
if searchBar.text != nil, searchBar.text != ""{
print("Search bar text exists")
print(searchBar.text!)
fetchRequest.sortDescriptors = [titleSort]
//Search; Only display cell if searchBar.text = Item.allergen
} else {
print("Search bar text does not exist!")
fetchRequest.sortDescriptors = [titleSort]
}
}
let controller = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: context, sectionNameKeyPath: nil, cacheName: nil)
controller.delegate = self
self.controller = controller
do {
try controller.performFetch()
} catch {
let error = error as NSError
print("\(error)")
}
}
我試圖使用NSPredicate來做到這一點,但它導致在實體錯誤中找不到關鍵路徑。我會包含這些代碼,但我確定它完全錯誤。
有什麼建議嗎?
更新:
Here's a picture of the Item entity's attributes in the Core Data Model.This is the code in the ItemEntity.swift file, I think this was autogenerated?希望這是你需要的東西。
更新2: 感謝您的幫助!我找到了解決方案。這是爲我工作的代碼:
let userSearch = searchBar.text!
commitPredicate = NSPredicate(format: "allergen == %@", userSearch)
fetchRequest.predicate = commitPredicate
你還可以在這裏發佈你的物品類嗎?希望看到該課程的屬性。 – Aks
不相關,但爲什麼你總是創建新的獲取結果控制器?添加一個屬性'sortDescriptors'並使用'didSet'觀察者來更新控制器謂詞的'sortDescriptors'並執行一次提取。 – vadian
您是否想在選擇分段控制器時對對象進行排序? – Mannopson