2017-10-08 123 views
1

我是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 
+0

你還可以在這裏發佈你的物品類嗎?希望看到該課程的屬性。 – Aks

+0

不相關,但爲什麼你總是創建新的獲取結果控制器?添加一個屬性'sortDescriptors'並使用'didSet'觀察者來更新控制器謂詞的'sortDescriptors'並執行一次提取。 – vadian

+0

您是否想在選擇分段控制器時對對象進行排序? – Mannopson

回答

0

添加以下斷言只過濾那些恰好搜索文本匹配:

fetchRequest.predicate = NSPredicate(format:"allergen == %@", searchBar.text) 

或者,您可能想匹配,如果allergen字符串包含搜索文本:

fetchRequest.predicate = NSPredicate(format:"allergen CONTAINS %@", searchBar.text) 

爲了使對比情況和變音符號不敏感,加[cd](所以... ==[cd] ...Ø r ... CONTAINS[cd] ...)。

+0

這工作!謝謝! – Thejm

相關問題