четверг, 5 апреля 2012 г.

Делаем поиск в UITableView с помощью UISearchBar

Для начала надо подготовить основной контроллер вьюхи для работы с UISearchBar:


@interface MyViewController : UITableViewController <UISearchDisplayDelegate, UISearchBarDelegate, UITableViewDelegate, UITableViewDataSource{
    
    // For Search!
    NSArray *searchResults;
    IBOutlet UISearchDisplayController *searchController;
}


@property(nonatomic, copy) NSArray *searchResults;
@property(nonatomic, retain) IBOutlet UISearchDisplayController *searchController;

@end

Затем добавить во вьюху Search Display Controller и правильно соединить его с аутлетами! В качестве делегата естественно назначить FileOwner.


И добавить следующие методы:

#pragma mark - UISearchDisplayController delegate methods


- (void)filterContentForSearchText:(NSString*)searchText 
                             scope:(NSString*)scope
{
    NSPredicate *resultPredicate = [NSPredicate predicateWithFormat:
                                    @"name contains %@", searchText];
    
    self.searchResults = [myObject.subObjArray filteredArrayUsingPredicate:resultPredicate];
}

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

- (BOOL)searchDisplayController:(UISearchDisplayController *)controller 
shouldReloadTableForSearchScope:(NSInteger)searchOption
{
    [self filterContentForSearchText:[self.searchDisplayController.searchBar text
                               scope:[[self.searchDisplayController.searchBar scopeButtonTitles]
                                      objectAtIndex:searchOption]];
    
    return YES;
}

Результаты поиска будут храниться во вспомогательном массиве searchResults . Поэтому нужно немного подкорректировать следующие методы:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    // Return the number of rows in the section.
    NSInteger rows = 0;
    
    if ([tableView 
         isEqual:self.searchDisplayController.searchResultsTableView]){
        rows = [self.searchResults count];
    }
    else{
        rows = [myObj.subObjArray count];
    }
    
    return rows;
}

и
// Customize the appearance of table view cells.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath

1 комментарий:

  1. Чтобы фильтр, а точнее предикат не был чувствителен к регистру, можно сделать так: CONTAINS[c], либо [NSPredicate predicateWithFormat:@"ANY keywords.name CONTAINS[c] %@", ...];
    либо ANY name CONTAINS[cd]

    пробуйте!

    ОтветитьУдалить