Результаты UISearchController не фильтруются

Итак, я использую UISearchController в своем проекте, и, кажется, все работает нормально, но что бы я ни набирал в строке поиска, я не получаю результатов. Поэтому я считаю, что проблема в моем (void)updateSearchResultsForSearchController:(UISearchController *)searchController { }. Честно говоря, я действительно не знаю, какой код вставить в этот метод. Вот остальная часть кода:

@property (nonatomic, strong) UISearchController *searchController;
@property (nonatomic, strong) SearchResultsTableViewController *resultsTableController;
@property (nonatomic, strong) NSMutableArray *searchResults; // Filtered search results
// for state restoration
@property BOOL searchControllerWasActive;
@property BOOL searchControllerSearchFieldWasFirstResponder;

 _resultsTableController = [[SearchResultsTableViewController alloc] init];
_searchController = [[UISearchController alloc] initWithSearchResultsController:self.resultsTableController];
self.searchController.searchResultsUpdater = self;
[self.searchController.searchBar sizeToFit];
self.tableView.tableHeaderView = self.searchController.searchBar;

self.searchController.delegate = self;
self.searchController.dimsBackgroundDuringPresentation = NO; 
self.searchController.searchBar.delegate = self; 
self.searchController.searchBar.tintColor = [UIColor darkGrayColor];
self.definesPresentationContext = YES;  

- (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];

// restore the searchController's active state
if (self.searchControllerWasActive) {
    self.searchController.active = self.searchControllerWasActive;
    _searchControllerWasActive = NO;

    if (self.searchControllerSearchFieldWasFirstResponder) {
        [self.searchController.searchBar becomeFirstResponder];
        _searchControllerSearchFieldWasFirstResponder = NO;
    }
}}

#pragma mark - UISearchBarDelegate
- (void)searchBarSearchButtonClicked:(UISearchBar *)searchBar {
[searchBar resignFirstResponder];}


#pragma mark - UISearchResultsUpdating

- (void)updateSearchResultsForSearchController:(UISearchController *)searchController {
}

person Sergio Robles    schedule 04.12.2014    source источник


Ответы (1)


Вам нужно будет взять NSArray, из которого поступают данные вашего табличного представления, отфильтровать его в соответствии с вашими критериями поиска, а затем перезагрузить табличное представление. Ваш код может выглядеть примерно так:

- (void) doSearch:(NSString *)searchText {
    [self.filteredClients removeAllObjects];

    if ( [searchText length] == 0 ) {
        [self.filteredClients addObjectsFromArray:self.users];
    } else {
        for (User *user in self.users) {
            NSString *name = [user fullName];
            NSRange range = [[name lowercaseString] rangeOfString:[searchText lowercaseString]];
            if ( range.location != NSNotFound )
                [self.filteredClients addObject:user];
        }
    }
    [self.tableView reloadData];
}


- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText {
    if ( [searchText length] > 0 )
    {
        [self showCancelButton:YES];
    }
    else {
        [self showCancelButton:NO];
        [searchBar resignFirstResponder];
    }
    [self doSearch:searchText];
}


- (void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar
{
    [self showCancelButton:YES];
}

- (void)searchBarTextDidEndEditing:(UISearchBar *)searchBar
{
    if ( [searchBar.text length] > 0 )  [self showCancelButton:YES];
    else                                [self showCancelButton:NO];
    [self doSearch:_searchBar.text];
}
person Larry Borsato    schedule 04.12.2014
comment
Привет, Ларри, я не уверен, что ты имеешь в виду под пользователем в условии for?? - person Sergio Robles; 04.12.2014
comment
NSString *searchText = searchController.searchBar.text; NSMutableArray *searchResults = [self.tableData mutableCopy]; if ([длина searchText] == ​​0) { [self.searchResults addObjectsFromArray:self.tableData]; } else { for (NSString *searchString in self.tableData) { NSString *name = [searchString self]; NSRange range = [[имя строчной строки] rangeOfString: [строка нижнего регистра searchText]]; if ( range.location != NSNotFound ) [self.searchResults addObject:searchString];}} [self.tableView reloadData]; - person Sergio Robles; 04.12.2014
comment
Жалко Серхио. Я должен был объяснить, что мои исходные данные поступают из NSArray пользователей (здесь self.users), каждый из которых является классом User (в основном NSDictionary). Я перебираю каждого пользователя, сравниваю его полное имя с текстом поиска. Если найдено, я добавляю эту запись в NSArray клиентов self.filtered, который используется для заполнения моего табличного представления. Затем я перезагружаю представление таблицы. Вы заметите, что если нет текста для поиска, я всех пользователей перенаправляю на self.filteredclients, поэтому табличное представление отображает их всех. - person Larry Borsato; 04.12.2014
comment
Итак, для этого необходимо создать класс? Я имею в виду, что в своем проекте я только что создал NSArray, который будет моим self.tableData, таким же, как ваш NSArray пользователей. - person Sergio Robles; 04.12.2014
comment
Нет. В моем коде есть класс, потому что он использует другие вещи. Я создал для вас суть, которая может упростить это, используя NSArray и NSDictionary - gist.github.com/lborsato /d52ca5e286111f84fcf5. - person Larry Borsato; 04.12.2014
comment
Хорошо, теперь я понял! Спасибо, все равно мой проект вылетает, как только я набираю слово в строке поиска.. Не знаю точно, в чем может быть проблема - person Sergio Robles; 05.12.2014
comment
Потенциально это могло произойти, если вы установили делегат, но делегат не содержал этих методов делегата. Просто проверьте журнал и посмотрите, почему вы потерпели крах. - person Larry Borsato; 05.12.2014
comment
gist.github.com/sergiorobles198/d35c6a40bc531860d242 — я создал эту суть с реальным проектом, все основан на образце кода Table Search от Apple. Я все еще не могу найти ошибку на нем. Мне действительно тяжело с этим. - person Sergio Robles; 05.12.2014
comment
Где вы работаете с - (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)? Когда ваша программа дает сбой, что она говорит в окне журнала? Вы должны увидеть дамп сбоя/стека с указанием причины. - person Larry Borsato; 05.12.2014