문제

필터링하는 모범 사례는 무엇입니까? NSFetchedResultsController 데이터? SearchBar의 텍스트가 변경 될 때마다 다시 시작해야합니까?

나는 a를 사용하고있다 UISearchDisplayControllers 그리고 나는 구현하고있다 :

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

고마워.

도움이 되었습니까?

해결책

Guy의 답변 코드는 질문과 어떻게 다른가요? 내가 추측 할 수있는 한, FilterContentForsearchText : SCOPE 메소드는 ThistReload 메소드에 의해 호출됩니까?

어쨌든, 여기에 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;
}

추신. vivas에 대답하기 위해 uisearchDisplayController를 사용하여 필터링 된 목록을 오버레이하기 위해 자동으로 새 테이블보기를 만듭니다. 문서에서 표시된대로 사용되는 테이블 뷰를 확인할 수 있지만 가장 간단한 설정에서는 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];

 }
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top