2

I 배열을 검색하는 검색 막대가 있으며 결과가있는 UITableView가 업데이트됩니다. 테이블 뷰는 제목과 저자와 책의 목록입니다UISearchBar가 두 배열을 검색합니다.

The titles and authors

는 지금, 검색 창은 제목을 검색하지만 난 그것뿐만 아니라 저자를 검색하고 싶습니다. 다음은 검색 코드입니다 (나는 http://blog.webscale.co.in/?p=228에서 가져 왔습니다).

- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText 
{ 
    [tableData removeAllObjects];// remove all data that belongs to previous search 
    if([searchText isEqualToString:@""]||searchText==nil){ 
     [tableView reloadData]; 
     return; 
    } 

    for(NSString *name in dataSource){ 
     NSInteger counter = 0; 

     //NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init]; 
     NSRange r = [[name lowercaseString] rangeOfString:[searchText lowercaseString]]; 
     if(r.location != NSNotFound) 
      [tableData addObject:name]; 


      counter++; 
    } 
     //[pool release]; 


    [tableView reloadData]; 

}

데이터 소스는 제목을 포함 NSMutable 배열입니다. 작성자가 포함 된 배열을 "작성자"라고합니다. "tableData"는 화면에 표시되어야하는 셀 (검색되는 용어가 포함 된 셀)을 저장하는 배열입니다. 너무 많은

감사합니다,

누가 복음

답변

8

나는 키 값 쌍 (책 클래스는 더 좋을 것이다)와 함께있는 NSDictionary를 작성하여 제목과 저자를 모두 포함하는 데이터 원본 배열을 수정하는 것입니다.

//Do this for each book 
NSDictionary * book = NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys: 
    title, @"TITLE", author, @"AUTHOR", nil]; 
[dataSource addObject:book]; 

그런 다음 NSDictionary에서 작동하도록 검색 방법을 변경할 수 있습니다. 이 방법은 변경에게있는 NSDictionary 아니라 제목 문자열과 함께 작동하도록 cellForRowAtIndexPath 방법을 것을 사용

- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText 
{ 

    [tableData removeAllObjects]; 

    if(searchText != nil && ![searchText isEqualToString:@""]){ 

     for(NSDictionary * book in dataSource){ 
      NSString * title = [book objectForKey:@"TITLE"]; 
      NSString * author = [book objectForKey:@"AUTHOR"]; 

      NSRange titleRange = [[title lowercaseString] rangeOfString:[searchText lowercaseString]]; 
      NSRange authorRange = [[author lowercaseString] rangeOfString:[searchText lowercaseString]]; 

      if(titleRange.location != NSNotFound || authorRange.location != NSNotFound) 
       [tableData addObject:book]; 
      } 

    } 

    [tableView reloadData]; 
} 

참고.

+0

완벽한 대답 @Joel 크라 베츠 – Jashu

1
-(void)searchBar:(UISearchBar *)searchBar1 textDidChange:(NSString *)searchText 
{ 
if ([searchText length]==0) 
{ 
    temp_array1 =[array_Main1 mutableCopy]; 
    temp_array2 =[array_Main2 mutableCopy]; 
    temp_array3 =[array_Main3 mutableCopy]; 
} 
else 
{ 
    [temp_array1 removeAllObjects]; 
    [temp_array2 removeAllObjects]; 
    [temp_array3 removeAllObjects]; 
    int g = 0; 
    for (int i=0; i< array_Main1.count;i++) 
    { 
     NSRange Range1 = [[array_Main1 objectAtIndex:i] rangeOfString:searchText options:NSCaseInsensitiveSearch]; 
     NSRange Range2 = [[array_Main2 objectAtIndex:i] rangeOfString:searchText options:NSCaseInsensitiveSearch]; 
     NSRange Range3 = [[array_Main3 objectAtIndex:i] rangeOfString:searchText options:NSCaseInsensitiveSearch]; 
     if (Range1.location != NSNotFound || Range2.location != NSNotFound || Range3.location != NSNotFound) 
     { 
      [temp_array1 addObject:[array_Main1 objectAtIndex:g]]; 
      [temp_array2 addObject:[array_Main2 objectAtIndex:g]]; 
      [temp_array3 addObject:[array_Main3 objectAtIndex:g]]; 

     } 
     g++; 
    } 
} 
[table reloadData]; 
} 
0
- This is Helpful when you search from Dictionary. 

NSMutableArray *contentList; 
NSMutableArray *filteredContentList; 
BOOL isSearching; 

// firstSection is array which already filled. 
// contentList array for value of particular key 
// filteredContentList is search array from actual array. 

    - (void)searchTableList { 
     NSString *searchString = searchBar.text; 

     NSPredicate *filterPredicate = [NSPredicate predicateWithFormat:@"frame_code beginswith[c] %@", searchString]; 
     NSArray *filteredArr = [firstSection filteredArrayUsingPredicate:filterPredicate]; 
     if(contentList.count > 0) 
      [contentList removeAllObjects]; 
     [filteredContentList addObjectsFromArray:filteredArr]; 
    } 

    - (void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar1 { 

     if ([searchBar1.text length] != 0) 
      isSearching = YES; 
     else 
      isSearching = NO; 
    } 

    - (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText { 
     NSLog(@"Text change - %d",isSearching); 

     //Remove all objects first. 
     [filteredContentList removeAllObjects]; 

     if([searchText length] != 0) { 
      isSearching = YES; 
      [self searchTableList]; 
     } 
     else { 
      isSearching = NO; 
     } 
     [tblFrameList_SComplete reloadData]; 
    } 

    - (void)searchBarCancelButtonClicked:(UISearchBar *)searchBar { 
     NSLog(@"Cancel clicked"); 
    } 

    - (void)searchBarSearchButtonClicked:(UISearchBar *)searchBar { 
     NSLog(@"Search Clicked"); 
     [self searchTableList]; 
    } 
관련 문제