2

2 つのスコープ ボタンを持つ UISearchBar を使用しています。検索テキストがない場合でも、スコープ ボタンを使用して行をフィルター処理したいと考えています。現在、検索テキストがある場合にのみ行がフィルタリングされます。デバッグから、searchResultsTableView のフレーム サイズがゼロであることがわかります。

何か案は?

4

2 に答える 2

0

これを行うには、すべてのデータを含む配列を保存します。searchText.length == 0 の場合の textDidChange では、検索結果の配列の代わりにすべてのコピーを表示します

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

    if (searchText.length == 0) {
        tableSource = [NSMutableArray arrayWithArray: self.homeSheets.data];
        [self.tableView reloadData];
        return;
    }

    ...
}
于 2014-10-09T14:26:55.093 に答える
0

これをチェックしてください...

ViewController.h ファイル内:

@interface ViewController : UITableViewController <UISearchBarDelegate, UISearchDisplayDelegate>
{
    UISearchBar *searchBar;
    UISearchDisplayController *searchDisplayController;
}

@property (nonatomic, retain) NSArray *friendsArray;
@property (nonatomic, retain) NSArray *searchResults;

- (void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope;

そしてViewController.mファイルで:

- (id)initWithStyle:(UITableViewStyle)style
{
    self = [super initWithStyle:style];
    if (self) {

        self.friendsArray = [[NSArray alloc]initWithObjects:@"Napoli",@"Juventus",@"Inter",@"Milan", @"Lazio",@"Real Madrid",@"Barcelona",@"Villareal",@"Valencia",@"Deportivo",@"Manchester City",@"Manchester United",@"Chelsea",@"Arsenal",@"Liverpool", nil];
        self.searchResults = [[NSArray alloc] init];

    }
    return self;
}
- (void)viewDidLoad
{
    [super viewDidLoad];

    searchBar = [[UISearchBar alloc] initWithFrame:CGRectMake(0, 0, 160, 44)];
    searchDisplayController = [[UISearchDisplayController alloc] initWithSearchBar:searchBar contentsController:self];

    searchDisplayController.delegate = self;
    searchDisplayController.searchResultsDataSource = self;

    self.tableView.tableHeaderView = searchBar;

}

#pragma mark - Table view data source

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{

    if (tableView == self.searchDisplayController.searchResultsTableView) {
        return [self.searchResults count];

    } else {
        return [self.friendsArray count];

    }

}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
    }

    // Configure the cell...

    if (tableView == self.searchDisplayController.searchResultsTableView) {
        cell.textLabel.text = [self.searchResults objectAtIndex:indexPath.row];
    } else {
        cell.textLabel.text = [self.friendsArray objectAtIndex:indexPath.row];
    }


    return cell;
}

#pragma mark - searchDisplayControllerDelegate


-(BOOL)searchDisplayController:(UISearchDisplayController *)controller
shouldReloadTableForSearchString:(NSString *)searchString
{
    [self filterContentForSearchText:searchString
                               scope:[[self.searchDisplayController.searchBar scopeButtonTitles]
                                      objectAtIndex:[self.searchDisplayController.searchBar
                                                     selectedScopeButtonIndex]]];

    return YES;
}

- (void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope
{
    NSPredicate *resultPredicate = [NSPredicate
                                    predicateWithFormat:@"SELF contains[cd] %@",
                                    searchText];

    self.searchResults = [self.friendsArray filteredArrayUsingPredicate:resultPredicate];
}
于 2013-06-10T11:00:22.760 に答える