2014-07-24 2 views
1
How do I filter this object array using NSPredicate filteredArrayUsingPredicate/predicateWithBlock? 

클래스 Person이 클래스의 각 객체가 배열 objPersonCell에 저장됩니다 lastNamefirstName 같은 몇 가지 특성을 가지고 내 모달 클래스입니다. 그리고 내 뷰 컨트롤러에서 내가 사용 UITableViewCell에 표시하는 필드입니다 :NSPredicate를 사용하여이 개체 배열을 어떻게 필터링합니까?

// way similar to this 
     for(NSMutableArray *obj in self.objPersonCell){ 
      lblFirstName.text = [(Person *)obj personType]; 
     } 

문제 : 검색, 나는 사용자가 입력 NSPredicate를 사용하여 objPersonCell를 필터링하고 즉시 jQuery과의 데이터를 다시로드하여 변경 사항을 반영 할 . 이제 NSPredicate을 어떻게 사용합니까? 내가 시도 무엇

은 다음과 같습니다 updateAsPerSearchTerm 내부

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string 
    { 
     NSString *searchTerm = [textField.text stringByReplacingCharactersInRange:range withString:string]; 
     [self updateAsPerSearchTerm: searchTerm]; 

     return YES; 
    } 

-(void)updateAsPerSearchTerm:(NSString *)searchTerm 
{ 

    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"self contains[cd] %@",searchTerm]; 
    NSArray *sortedArray = [[(Person *)self.objPersonCell] filteredArrayUsingPredicate:predicate]; 

    [self.objPersonCell removeAllObjects]; 
    [self.objPersonCell addObjectsFromArray:sortedArray]; 
    [self.tableView reloadData]; 
} 

코드는 objPersonCell를 전달하는 잘못된 것입니다. 어떻게 설정해야합니까? 그리고 어떻게하면 predicateWithBlock 나를 도와 줄 수 있을까요?

답변

1

캐스팅에 대해 혼란스러워합니다. 이 코드는 다음 objPersonCell 배열의 내용이 Person 객체이기 때문에

for(NSMutableArray *obj in self.objPersonCell){ 
    lblFirstName.text = [(Person *)obj personType]; 
} 

for (Person *obj in self.objPersonCell){ 
    lblFirstName.text = [obj personType]; 
} 

해야한다.

비슷한 문제가 여기에 있습니다 :

@property (strong, nonatomic) NSMutableArray *objPersonCell; 
@property (strong, nonatomic) NSArray *tableDataSource; 

:

NSArray *sortedArray = [[(Person *)self.objPersonCell] filteredArrayUsingPredicate:predicate]; 

당신이해야하는 위치

NSArray *sortedArray = [self.objPersonCell filteredArrayUsingPredicate:predicate]; 

지금, 당신의 필터링 문제에, 당신은 몇 가지 속성을 가져야한다 기본적으로 :

self.tableDataSource = self.objPersonCell; 

당신은 검색을 수행 할 때 사용자가 검색 완료/취소 할 때

self.tableDataSource = sortedArray; 

을 : 검색 (그리고 그 내용을 손상) 동안

self.tableDataSource = self.objPersonCell; 

당신이 결코 objPersonCell을 편집하지 않습니다 이러한 방법을 당신을 서로 다른 원본 배열간에 전환하지 않으려는 경우 테이블 데이터 원본 메서드가 간단합니다. 테이블 데이터 원본 메서드는 objPersonCell이 아니라 tableDataSource 만 사용해야합니다.

관련 문제