1

UITableView で検索を実行できません。UITableViewController h ファイルでデリゲートなどを宣言しました。

@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 を self に設定しました。

そして、私はこのようにメソッドを実装しました:

- (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 メソッドは呼び出されません!

4

1 に答える 1

4

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

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

検索を処理します。必要に応じて、完全な例をお送りします。

配列がフィルタリング対象であると仮定した例:

#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];
}

注 - workingTableViewData と originalTableViewData はどちらもプライベート プロパティです。originalTableViewData は NSArray で、workingTableViewData は NSMutableArray です。

于 2012-04-07T02:19:07.340 に答える