2

I配列を検索する検索バーがあり、その結果でUITableViewが更新されます。テーブルビューは、タイトルと作者で、本のリストです:UISearchBarは2つの配列を検索します

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

私は(Bookクラスが良いだろう)、キーと値のペアと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 Kravets – 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]; 
    } 
関連する問題