2009-09-13 2 views
17

NSFetchedResultsController 데이터를 필터링하는 가장 좋은 방법은 무엇입니까? 검색 막대의 텍스트가 변경 될 때마다 다시 초기화해야합니까?NSFetchedResultsController with

나는 UISearchDisplayControllers를 사용하고 그리고 난 구현 해요 :

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

들으을.

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

} 
+0

테이블보기에서 '필터링 된 목록'을 표시할지 여부를 알 수 있도록 테이블보기 데이터 원본 메서드를 어떻게 처리 했습니까? – CraigH

+1

여기에 대한 답변은 매우 도움이됩니다. http://stackoverflow.com/questions/4471289/how-to-filter-nsfetchedresultscontroller-coredata-with-uisearchdisplaycontrol/4481896#4481896 – acecapades

+0

내가 한 행동은 다음과 같습니다. http : // stackoverflow .com/questions/4471289/how-to-filter-nsfetchedresults 컨트롤러 - 코어 데이터 - 사용자 검색 표시 제어/4856118 # 4856118 –

답변

17

어떻게 가이의 응답 코드는 문제에서 어떤 다른 :

+0

여전히 이상한 동작 ... 객체가 필터링되지만, 테이블 뷰를 아래로 스크롤하면 fetchController에 특정 인덱스에 객체가 없으므로 예외가 발생합니다. 무엇이 잘못 될 수 있습니까? 제발, 도와주세요 –

+0

내 문제를 알아 냈어. 내가 필터링 된 결과를 얻을 때 테이블 뷰에 같은 방식으로 구성되어 있고 행 번호 X로 스크롤 할 때 행의 실제 수가 X보다 작습니다 ... 무엇을할까요? 내가해야 할 .. –

8

는 Appearantly이 더 나은 방법이 있나요? 늘어나는만큼, 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. UISearchDisplayController를 사용하여 Vivas에 응답하려면 필터링 된 목록을 오버레이하기 위해 자동으로 새 테이블 뷰를 만듭니다. 어떤 tableView가 문서에 표시된 것처럼 사용되었는지 확인할 수 있지만 가장 간단한 설정에서는 fetchedResultsController가 검색 테이블보기에 필터링 된 버전을 표시하거나 테이블보기에 모든 데이터를 표시하기 때문에 작동합니다.

+29

종료 (-1) 약간 가혹합니다. – 0xced

+5

appl docs는 가져 오기 요청을 변경해서는 안된다고 말합니다. 특히 술어를 변경해서는 안된다고 말합니다. –

+1

@RogerNolan 확실합니까? 체크 아웃 [NSFetchedResultsController 클래스 참조 : 가져 오기 요청 수정] (http://j.mp/z3W7QK). 그 세 단계는 나를 위해 잘 작동하고 심지어 가져 오기 요청의 조건자를 수정합니다. – ma11hew28