2012-02-23 4 views
0
- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText { 

    [displayItems removeAllObjects]; //clear array to ensure no repeat info 
    if ([searchText length] == 0) { 
     displayItems = (NSMutableArray *)allItems; 
    } 
    else { 
     //search by item category 
     NSPredicate *catPredicate = [NSPredicate predicateWithFormat:@"category 
      CONTAINS[cd] %@",searchText]; 
     [searchable filterUsingPredicate:catPredicate]; 
     //further search by item name 
     NSPredicate *namePredicate = [NSPredicate predicateWithFormat:@"name CONTAINS[cd] 
      %@",searchText]; 
     [searchable filterUsingPredicate:namePredicate]; 

     displayItems = searchable; 
     searchable = (NSMutableArray *)allItems; 
    } 
    [self.searchResults reloadData]; 
} 

이 메서드는 더 큰 프로젝트를 만들려고하는 간단한 검색 가능한 테이블 뷰의 일부입니다. 내 코드가 컴파일되어 실행되고 검색 바에 뭔가를 입력하면 검색 기능이 작동하지만 두 번째 문자를 입력하자마자 프로그램이 중단됩니다. 두 글자를 연속으로 입력하면 'NSInvalidArgumentException'이 발생합니다. 이유 : '- [_ NSArrayI filterUsingPredicate :] : 인스턴스 0x6d6c040으로 전송 된 인식 할 수없는 선택자' '문자 하나를 입력 한 다음 Enter 키 또는 백 스페이스 키를 누르면, 이 남자는 'NSInvalidArgumentException', 이유 : '- [ _NSArrayI removeAllObjects] : 두 번째 문자를 입력 할 때 인스턴스 0x6a7f300'으로 전송 된 인식 할 수없는 선택기를 보냅니다.NSPredicate를 사용하여 개체 배열 검색

저는 객관적으로 새로운 c입니다. 그리고 이것은 저에게 당혹 스럽습니다. 내가 얻을 수있는 모든 도움은 크게 감사하겠습니다 .... : -/여전히 업데이트 이후 문제가 있습니다.

+0

검색 가능 = (NSMutableArray *) allItems; NSArray를 NSMutableArray로 만들 수 없습니다. –

+0

검색 가능은 NSMutableArray로 선언되고, allItems는 NSArray입니다. 모든 항목을 검색 가능한 배열에 다시 넣을 수 있도록 캐스트했습니다. 이것이 합법적인지, 아니면 그것이 당신이 의미 한 것이 었는지 나는 모른다. 실망스럽고 혼란스럽게 되다니 죄송합니다. 그러나 객관적인 -C는 새로운 영역입니다. 참고로, 나는 문제의 라인과 NSPredicate 구문이 제거 된 완전히 다른 검색 알고리즘을 시도해 보았다. 그리고 함수가 작동하지 않는 것을 제외하면 같은 문제가 발생했다. –

+0

많은 감사합니다! NSPredicate 솔루션으로 돌아가서 addObjectsFromArray를 사용하여 캐스팅 명령문을 바꿨고 매력처럼 작동했습니다. 나는 정확히 왜 그런지 이해하지 못한다. 그러나 그것은 효과가있다. 도와 주셔서 감사합니다. –

답변

1

는 "하나는 단순히 이있는 NSMutableArray에 NSArray를 캐스팅 한 다음에있는 NSMutableArray 메소드를 호출하지 않습니다" 끝내면 검색 가능한 릴리스

+0

흥미 롭습니다. 나는 mutableCopy에 대해 몰랐다. 나는 지금, 고마워. –

+0

+1 Boromir 인용구 :) – mokagio

0

메서드를 호출하려면 NSMutableArray를 사용해야합니다.

NSArray에는 "filteredArrayusingPredicate"메서드가 있습니다.

간단한 해결책은 NSMutableArray를 사용하는 것입니다.

searchable = [allItems mutableCopy]; 

참고 :에 있는지 확인

이 같은 대신 변경 가능한 사본을 작성 보로미르

-

+0

** 검색 가능 ** 및 ** displayItems **는 둘 다 NSMutableArrays입니다. 비록 내가 검색 할 수있는 것은 단 한 번도 술어를 만지는 것이라고 생각합니다. –