Pregunta

¿Cuál es la mejor práctica para filtrar los datos de NSFetchedResultsController ? ¿Necesito reiniciarlo cada vez que cambia el texto de la barra de búsqueda?

Estoy usando un UISearchDisplayControllers y estoy implementando:

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

Thx.

¿Fue útil?

Solución

¿En qué se diferencia el código de respuesta de Guy de la pregunta? Por lo que puedo adivinar, el método filterContentForSearchText: scope es invocado por los métodos shouldReload?

De todos modos, aquí hay un código similar que agregué en la muestra CoreDataBooks para incluir la búsqueda. Agregue un controlador de pantalla de búsqueda en IB para el ejemplo CoreDataBooks. Luego agregué código a RootViewController.m de la siguiente manera:

- (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. Para responder a Vivas, usando un UISearchDisplayController crea automáticamente una nueva vista de tabla para superponer la lista filtrada. Puede verificar qué tableView se está utilizando como se muestra en los documentos, pero en la configuración más simple simplemente funciona porque fetchedResultsController muestra una versión filtrada en la vista de tabla de búsqueda o muestra todos los datos en su vista de tabla.

Otros consejos

Aparentemente esta es una mejor manera:

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

 }
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top