検索付きのNSFetchedResultsController
-
07-07-2019 - |
質問
NSFetchedResultsController
データをフィルタリングするためのベストプラクティスは何ですか?
検索バーのテキストが変更されるたびに再初期化する必要がありますか?
UISearchDisplayControllers
を使用しており、実装しています:
- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString;
Thx。
解決
Guyの回答コードは質問とどう違うのですか?私が推測できる限り、filterContentForSearchText:scopeメソッドはshouldReloadメソッドによって呼び出されますか?
とにかく、ここに検索を含めるためにCoreDataBooksサンプルで追加したいくつかの同様のコードがあります。 CoreDataBooksの例の検索ディスプレイコントローラーをIBに追加します。次に、次のようにコードをRootViewController.mに追加しました。
- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString {
NSInteger searchOption = controller.searchBar.selectedScopeButtonIndex;
return [self searchDisplayController:controller shouldReloadTableForSearchString:searchString searchScope:searchOption];
}
- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchScope:(NSInteger)searchOption {
NSString* searchString = controller.searchBar.text;
return [self searchDisplayController:controller shouldReloadTableForSearchString:searchString searchScope:searchOption];
}
- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString*)searchString searchScope:(NSInteger)searchOption {
NSPredicate *predicate = nil;
if ([searchString length])
if (searchOption == 0) // full text, in my implementation. Other scope button titles are "Author", "Title"
predicate = [NSPredicate predicateWithFormat:@"title contains[cd] %@ OR author contains[cd] %@", searchString, searchString];
else
// docs say keys are case insensitive, but apparently not so.
predicate = [NSPredicate predicateWithFormat:@"%K contains[cd] %@", [[controller.searchBar.scopeButtonTitles objectAtIndex:searchOption] lowercaseString], searchString];
[fetchedResultsController.fetchRequest setPredicate:predicate];
NSError *error = nil;
if (![[self fetchedResultsController] performFetch:&error]) {
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}
return YES;
}
PS。 Vivasに回答するには、UISearchDisplayControllerを使用して、フィルター処理されたリストをオーバーレイするための新しいテーブルビューを自動的に作成します。ドキュメントに示されているように、どのtableViewが使用されているかを確認できますが、最も単純な設定では、fetchedResultsControllerが検索のテーブルビューにフィルターバージョンを表示するか、テーブルビューにすべてのデータを表示するため、動作します。
他のヒント
どうやらこれはより良い方法です:
- (void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope
{
self.savedSearchTerm = searchText;
freshData = NO;
if (searchText !=nil)
{
NSPredicate *predicate =[NSPredicate predicateWithFormat:@"name contains[cd] %@", searchText];
[fetchedResultsController.fetchRequest setPredicate:predicate];
}
else
{
NSPredicate *predicate =[NSPredicate predicateWithFormat:@"All"];
[fetchedResultsController.fetchRequest setPredicate:predicate];
}
NSError *error = nil;
if (![[self fetchedResultsController] performFetch:&error]) {
// Handle error
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
exit(-1); // Fail
}
[self.tableView reloadData];
// [searchBar resignFirstResponder];
// [_shadeView setAlpha:0.0f];
}
所属していません StackOverflow