代码之家  ›  专栏  ›  技术社区  ›  Guy

带搜索的nsfetchedresultsController

  •  17
  • Guy  · 技术社区  · 17 年前

    过滤 NSFetchedResultsController 数据? 每次搜索栏的文本更改时是否需要重新初始化它?

    我正在使用 UISearchDisplayControllers 我正在实施:

    - (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString;
    

    谢谢。

    2 回复  |  直到 14 年前
        1
  •  17
  •   Vincent Gable    14 年前

    盖伊的答案和问题有什么不同?据我猜测,filterContentForsearchText:scope方法是由shouldReload方法调用的?

    无论如何,这里有一些类似的代码,我在coredatabooks示例中添加了这些代码来包含搜索。在ib中为coredatabooks示例添加搜索显示控制器。然后我将代码添加到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,它会自动创建一个新的表视图,用于覆盖筛选的列表。您可以检查文档中显示的正在使用哪个表视图,但在最简单的设置中,它只起作用,因为FetchedResultsController要么在搜索的表视图中显示筛选后的版本,要么在表视图中显示所有数据。

        2
  •  8
  •   Alex Reynolds    16 年前

    从表面上看,这是一个更好的方法:

    - (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];
    
     }