2017-04-15 65 views
0

我一直在尋找如何使用NSFetchResultController進行搜索,但我遇到的大多數帖子都來自2年前。好吧,我試圖過濾對象,在我的情況下是口袋妖怪。這是我使用的功能。使用NSFetchResult控制器搜索

func attemptPokemonFetch(generation: String = "1", name: String = "") { 
    let context = coreData.persistentContainer.viewContext 

    let request: NSFetchRequest<Pokemon> = Pokemon.fetchRequest() 
    let sortByName = NSSortDescriptor(key: "id", ascending: true) 
    request.sortDescriptors = [sortByName] 
    request.predicate = NSPredicate(format: "generation = %@", generation) 
    if !name.isEmpty { 
     request.predicate = NSPredicate(format: "name CONTAINS[cd] %@", name) 
    } 

    let controller = NSFetchedResultsController(fetchRequest: request, managedObjectContext: context, sectionNameKeyPath: nil, cacheName: nil) 
    controller.delegate = self 
    self.controller = controller 

    do { 
     try controller.performFetch() 
    } 
    catch let err { 
     print(err) 
    } 
} 

我在視圖中調用該函數進行加載,搜索欄確實改變了文本,並且段改變了索引值。我知道如何過濾口袋妖怪並使用搜索。然而,我遇到的問題是當我開始搜索。當在特定代中搜索一個寵物小精靈時,其他口袋妖怪也會出現。所以我會在第二代寵物小精靈的索引2處尋找,並且在搜索時會出現不同世代的其他寵物小精靈。我不確定它是如何初始化上下文的。這是我的搜索欄功能的樣子。

func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) { 
    if searchBar == pokemonSearchBar { 
     let text = pokemonSearchBar.text! 
     self.attemptPokemonFetch(name: text) 
     collectionView.reloadData() 
    } 
} 

又如:可以說我有3種類型的人有些是瘦,正常和脂肪。當我在瘦人的索引中時,我只想尋找那些不是所有人都很瘦的人。那麼,我需要做些什麼來實現這種行爲。

真的很感激任何幫助。 :)

回答

1

在你的代碼

request.predicate = NSPredicate(format: "generation = %@", generation) 
if !name.isEmpty { 
    request.predicate = NSPredicate(format: "name CONTAINS[cd] %@", name) 
} 

第二次分配取代以前分配的謂語。 你可能想要的是

if name.isEmpty { 
    request.predicate = NSPredicate(format: "generation = %@", generation) 
} else { 
    request.predicate = NSPredicate(format: "generation = %@ AND name CONTAINS[cd] %@", generation, name) 
} 

更靈活的方法是使用NSCompoundPredicate

var predicates = [NSPredicate]() 
predicates.append(NSPredicate(format: "generation = %@", generation)) 
if !name.isEmpty { 
    predicates.append(NSPredicate(format: "name CONTAINS[cd] %@", name)) 
} 
request.predicate = NSCompoundPredicate(andPredicateWithSubpredicates: predicates) 
+0

謝謝馬丁,只是我想要的行爲。我不知道你可以添加AND到NSPredicate格式。新的使用謂詞,所以林想知道是否可以有一個OR。例如,讓我們說在搜索欄中,我可以讓他們按名稱搜索或通過pokemon標識進行搜索。這將如何工作? –

+0

@LuisRamirez:還有一個「OR」。查閱「Predicate編程指南」,您將在其中找到語法的描述。 –