2016-11-09 11 views
1

Я очень много борюсь с этой проблемой. Некоторые сообщения касаются этой проблемы, но в моем случае не было решения.Результаты просмотра таблицы результатов UISearchController пустые

В чем проблема: я хотел бы показать некоторые результаты с помощью метода UISearchController. Мой исходный вид таблицы с пользовательской ячейкой отлично работает в том смысле, что все мои записи здесь, и она отображается, как я хочу.

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

Но где я схожу с ума, это то, что отображаемый «новый» табличный вид (один с результатами) пуст (в том смысле, что весь вид заполнен с пустыми строками), несмотря на то, что отфильтрованные записи здесь и что cellForRowAtIndexPath выполняет свою работу (по крайней мере, пока она не станет отображаться).

Может ли кто-нибудь помочь мне разобраться с этим?

Код:

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

    NSPredicate *predicate; 

    NSString *searchText = searchController.searchBar.text; 
    NSInteger scope = searchController.searchBar.selectedScopeButtonIndex; 

    if (scope == 0) { 
     predicate = [NSPredicate predicateWithFormat:@"SELF.drugName contains[c] %@", searchText]; 

    } 

    if (scope == 1) { 
     predicate = [NSPredicate predicateWithFormat:@"SELF.marque contains[c] %@", searchText]; 

    } 

    else if (scope == 2) { 
     predicate = [NSPredicate predicateWithFormat:@"SELF.classFamily contains[c] %@", searchText]; 

    } 

    NSMutableArray *tempArray = [NSMutableArray arrayWithArray:[[[SubstrateStore sharedStore] allSubstrates] filteredArrayUsingPredicate:predicate]]; 
    self.filteredResults = [NSMutableArray arrayWithArray:tempArray]; 

    [self.tableView reloadData]; // -> I tried to remove, to change the table view, etc, it does change anything 
} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 

    TableViewCell *cell = (TableViewCell *)[tableView dequeueReusableCellWithIdentifier:kCellIdentifier forIndexPath:indexPath]; 

    Substrate *substrate = self.products[indexPath.row]; 

    if (_searchController.active && ![_searchController.searchBar.text isEqualToString:@""]) { 

     substrate = self.filteredResults[indexPath.row]; 
    } 

    [self configureCell:cell forProduct:substrate]; // when I check cell attributes (drugName,...), they are there... 

    return cell; // it works when no search is done (with the native table view) but the cell is not displayed when using the search bar (empty table view) 
} 

Я вам нужно больше кода ...

Спасибо!

+0

1. Вы уверены, что 'tempArray' имеет какой-либо объект ?. 2. Вы уверены, что 'self.filteredResults' является правильным источником данных' self.tableView'? 3. Когда вы вызываете '[self.tableView reloadData]', вызывается любой из методов 'UITableViewDelegate'? – Ryan

+0

Пробел был я забыл установить источник данных для себя для результатов tableview – Trichophyton

ответ

0

Ваша проблема заключается в том, что вы перезагружаете self.tableView, а не таблицу tableView searchController.

Убедитесь, что вы также правильно назначили dataSource и делегат таблицы viewView для контроля.

+0

Это было то, что я читал раньше, но даже при попытке перезагрузить отфильтрованное представление таблицы он, похоже, не работает. Или, наверное, я ошибаюсь, чтобы это сделать. Должен ли я перезагружать данные в одном месте? – Trichophyton

+0

Поскольку я прочитал, что для отображения результатов с помощью этого метода используется та же таблица. Как можно было бы перезагрузить табличное представление searchController? Я не уверен, что создаю другой tableview. – Trichophyton

+0

У вас две таблицы, это звучит. У вас есть главная таблица вашего VC, которая правильно обновляется, потому что вы вызываете '[self.tableView reload];', и у вас есть tableView, который существует в searchController. Я думаю, что это может быть под searchController.searchResults или что-то подобное. установите точку останова в этом методе и проверьте свой стек памяти, чтобы найти точное значение. В вашем поисковом контроле есть ссылка на отображаемую пустую таблицу, и вы никогда не обновляете данные для этой таблицы, поэтому она остается пустой. Обязательно присвойте делегату/источнику данных значение self для представления таблицы результатов. –

0
- (void)viewDidLoad { 
    [super viewDidLoad]; 

    self.products = [[SubstrateStore sharedStore] allSubstrates]; 
    self.filteredResults = [[NSArray alloc] init]; 

    self.tableView.tableFooterView = [[UIView alloc] initWithFrame:CGRectZero]; 

    // SearchBar 
    _resultsTableController = [[ResultsTableViewController alloc] init]; 
    _searchController = [[UISearchController alloc] initWithSearchResultsController:self.resultsTableController]; 
    self.searchController.searchResultsUpdater = self; 
    [self.searchController.searchBar sizeToFit]; 
    self.tableView.tableHeaderView = self.searchController.searchBar; 
    self.searchController.searchBar.showsScopeBar = YES; 
    self.searchController.searchBar.scopeButtonTitles = [NSArray arrayWithObjects:@"DCI", @"Nom de marque", @"Classe", nil]; 

    // we want to be the delegate for our filtered table so didSelectRowAtIndexPath is called for both tables 
    self.resultsTableController.tableView.delegate = self; 
    self.searchController.delegate = self; 
    self.searchController.dimsBackgroundDuringPresentation = NO; // default is YES 
    self.searchController.searchBar.delegate = self; // so we can monitor text changes + others 

    // Search is now just presenting a view controller. As such, normal view controller 
    // presentation semantics apply. Namely that presentation will walk up the view controller 
    // hierarchy until it finds the root view controller or one that defines a presentation context. 
    // 
    self.definesPresentationContext = YES; // know where you want UISearchController to be displayed 

} 

Это некоторый код, если он может помочь