2012-04-06 12 views
1

UITableViewで検索を行うことができません。私はのUITableViewController hのファイルになどデリゲートを宣言している:UITearchViewで検索を行うことができません。

@protocol searchTanksListDelegate 
- (void) searchTanksList:(UISearchBar *) sender textDidChange:(NSString *) searchText; 
@end 

@property (weak, nonatomic) id <searchTanksListDelegate> searchDelegate; 
@property (weak, nonatomic) IBOutlet UISearchBar *searchTanksList; 

私はのUITableViewControllerのviewDidLoad関数の中で自己をsearchTanksList.delegateを設定します。

と私は、このようにメソッドを実装している:

- (void)searchTanksList:(UISearchBar *)searchTanksList textDidChange:(NSString *)searchText 
{ 
    if (searchText.length == 0) 
    { 
     self.isFiltered = false; 
    } 
    else { 
     self.isFiltered = true; 
     self.searchResults = [[NSMutableArray alloc] init]; 
     for (tank* thisTank in self.tanks) 
     { 
      NSRange nameRange = [thisTank.tankProduct rangeOfString:searchText options:NSCaseInsensitiveSearch]; 
      NSRange numberRange = [thisTank.tankNumber rangeOfString:searchText options:NSCaseInsensitiveSearch]; 
      NSRange productNumberRange = [thisTank.tankProductNumber rangeOfString:searchText options:NSCaseInsensitiveSearch]; 
      if (nameRange.location != NSNotFound || numberRange.location != NSNotFound || productNumberRange.location != NSNotFound) 
      { 
       [self.searchResults addObject:thisTank]; 
      } 
     } 
    } 
} 

性質等を合成してきた - そのコードはエラーや警告なしでコンパイル私が入力したときに... textDidChangeメソッドはかかわらず、呼び出されません!

+0

宣言時にNSObjectにプロトコルが準拠していない理由はありません。 – CodaFi

+1

私は客観的なc/iosの開発に慣れていません。それは私をここに助ける...:o) – HillInHarwich

+0

それはこれであるべきです: '@protocol searchTanksListDelegate ' – CodaFi

答えて

4

searchBarをプロパティとして宣言し、クラスがUISearchBarDelegateに設定されていることを確認してください。次に、デリゲートメソッドを使用して:

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

検索を処理します。必要に応じて私はあなたに完全な例を送ることができます。 workingTableViewDataとoriginalTableViewData両方のプライベートな性質である -

#pragma mark - SearchBar Delegate Methods 
-(void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText 
{  
    [self filterContentForSearchText:searchText]; 
} 

-(void)searchBarCancelButtonClicked:(UISearchBar *)searchBar 
{ 
    searchBar.text = @""; 

    workingTableViewData = [[NSMutableArray alloc] initWithArray:originalTableViewData]; 
    [self.myTableView reloadData]; 

    [searchBar resignFirstResponder];  
} 

-(void)searchBarTextDidEndEditing:(UISearchBar *)searchBar 
{ 
    [searchBar resignFirstResponder]; 
} 

- (void)filterContentForSearchText:(NSString *)searchText 
{ 
    if (searchText && searchText.length) { 
     [self.workingTableViewData removeAllObjects];  
     for (NSDictionary *dictionary in originalTableViewData) 
     { 
      for (NSString *thisKey in [dictionary allKeys]) { 
       if ([thisKey isEqualToString:@"Key1"] || 
         [thisKey isEqualToString:@"Key2"]) { 
        if ([[dictionary valueForKey:thisKey] rangeOfString:searchText options:NSCaseInsensitiveSearch].location != NSNotFound) { 
         [workingTableViewData addObject:dictionary]; 
        } 

       } // if ([thisKey isEqualToString:@"Key1"] || [thisKey isEqualToString:@"Key2"]) 

      } // for (NSString *thisKey in [dictionary allKeys]) 

     } // for (NSDictionary *dictionary in originalTableViewData) 

     [self.myTableView reloadData]; 

    } // if (searchText && searchText.length) 

} 

-(void)searchBarSearchButtonClicked:(UISearchBar *)searchBar { 
    [self filterContentForSearchText:searchBar.text]; 
    [searchBar resignFirstResponder]; 
} 

注:アレイを想定し

例では、フィルタリングされているものです。 originalTableViewDataはNSArrayであり、workingTableViewDataはNSMutableArrayです。

+0

はい!私はそれが私がやったことだと思った! :-S – HillInHarwich

+0

Briliant - ありがとうございます。デリゲート、プロトコルなどを宣言する場所とちょっと混乱してしまいました。私はその多くを裂いてしまっていました。 :o)ありがとう。 – HillInHarwich

+0

@ElJayメソッド 'filterContentForSearchText:'はGrand Central Dispatchを使用する必要があります。あるいは、GCD構築は 'searchBar:textDidChange:'メソッドで実装する必要がありますか?または、これは重要ではありません。どこで使用するのですか?唯一の目的はメインスレッドを避けることですか? –

関連する問題