UISearchController searchBar ne disparaît pas lorsque vous appuyez sur le viewcontroller

J'utilise un UISearchController dans ma UIViewcontroller qui contient un UITableView , je le fais dans viewDidLoad :

  self.searchController = [[UISearchController alloc] initWithSearchResultsController:nil]; self.searchController.delegate = self; self.searchController.searchResultsUpdater = self; self.searchController.searchBar.delegate = self; self.searchController.dimsBackgroundDuringPresentation = NO; self.searchController.hidesNavigationBarDuringPresentation = NO; self.definesPresentationContext = NO; 

quand je pousse un button dans la barre de navigation, je fais ceci:

  self.tableView.contentOffset = CGPointMake(0, 0 - self.tableView.contentInset.top); self.tableView.tableHeaderView = self.searchController.searchBar; [self.searchController.searchBar becomeFirstResponder]; 

tout fonctionne bien, mais quand je pousse un UIViewController d'une rangée dans les résultats UITableView l' UISearchBar rest là et affiche aussi sur le contenu de l'autre vue, comment puis-je rejeter quand je pousse une vue et présente quand je reviens voir le résultat de UITableView ?

Merci

MODIFIER:

c'est le code de la méthode didSelectRowAtIndexPath :

 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { [self.tableView deselectRowAtIndexPath:indexPath animated:YES]; DetailListController *detailList = [[DetailListController alloc] init]; [self.navigationController pushViewController:detailList animated:YES]; } 

Essayez cette méthode standard suggérée par apple:

Déclarer les propriétés:

 @interface APLMainTableViewController () <UISearchBarDelegate, UISearchControllerDelegate, UISearchResultsUpdating> @property (nonatomic, strong) UISearchController *searchController; // our secondary search results table view @property (nonatomic, strong) APLResultsTableController *resultsTableController; // for state restoration @property BOOL searchControllerWasActive; @property BOOL searchControllerSearchFieldWasFirstResponder; @end - (void)viewDidLoad { [super viewDidLoad]; _resultsTableController = [[APLResultsTableController alloc] init]; _searchController = [[UISearchController alloc] initWithSearchResultsController:self.resultsTableController]; self.searchController.searchResultsUpdater = self; [self.searchController.searchBar sizeToFit]; self.tableView.tableHeaderView = self.searchController.searchBar; // 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 } - (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 - UISearchControllerDelegate // Called after the search controller's search bar has agreed to begin editing or when // 'active' is set to YES. // If you choose not to present the controller yourself or do not implement this method, // a default presentation is performed on your behalf. // // Implement this method if the default presentation is not adequate for your purposes. // - (void)presentSearchController:(UISearchController *)searchController { } - (void)willPresentSearchController:(UISearchController *)searchController { // do something before the search controller is presented } - (void)didPresentSearchController:(UISearchController *)searchController { // do something after the search controller is presented } - (void)willDismissSearchController:(UISearchController *)searchController { // do something before the search controller is dismissed } - (void)didDismissSearchController:(UISearchController *)searchController { // do something after the search controller is dismissed } 

et voici la partie intéressante: Utilisez le code ci-dessous pour restaurer l'état lorsque vous revenez de la vue détaillée

 #pragma mark - UIStateRestoration // we restore several items for state restoration: // 1) Search controller's active state, // 2) search text, // 3) first responder NSSsortingng *const ViewControllerTitleKey = @"ViewControllerTitleKey"; NSSsortingng *const SearchControllerIsActiveKey = @"SearchControllerIsActiveKey"; NSSsortingng *const SearchBarTextKey = @"SearchBarTextKey"; NSSsortingng *const SearchBarIsFirstResponderKey = @"SearchBarIsFirstResponderKey"; - (void)encodeRestorableStateWithCoder:(NSCoder *)coder { [super encodeRestorableStateWithCoder:coder]; // encode the view state so it can be restored later // encode the title [coder encodeObject:self.title forKey:ViewControllerTitleKey]; UISearchController *searchController = self.searchController; // encode the search controller's active state BOOL searchDisplayControllerIsActive = searchController.isActive; [coder encodeBool:searchDisplayControllerIsActive forKey:SearchControllerIsActiveKey]; // encode the first responser status if (searchDisplayControllerIsActive) { [coder encodeBool:[searchController.searchBar isFirstResponder] forKey:SearchBarIsFirstResponderKey]; } // encode the search bar text [coder encodeObject:searchController.searchBar.text forKey:SearchBarTextKey]; } - (void)decodeRestorableStateWithCoder:(NSCoder *)coder { [super decodeRestorableStateWithCoder:coder]; // restore the title self.title = [coder decodeObjectForKey:ViewControllerTitleKey]; // restore the active state: // we can't make the searchController active here since it's not part of the view // hierarchy yet, instead we do it in viewWillAppear // _searchControllerWasActive = [coder decodeBoolForKey:SearchControllerIsActiveKey]; // restore the first responder status: // we can't make the searchController first responder here since it's not part of the view // hierarchy yet, instead we do it in viewWillAppear // _searchControllerSearchFieldWasFirstResponder = [coder decodeBoolForKey:SearchBarIsFirstResponderKey]; // restore the text in the search field self.searchController.searchBar.text = [coder decodeObjectForKey:SearchBarTextKey]; } @end 

Vous devez appeler cela lorsque vous revenez de DetailListController à votre controller de vue (encapsulation dans le thread principal pour plus de security):

 dispatch_async(dispatch_get_main_queue(), ^{ self.searchController.active = NO; }); 

Vous pouvez également appeler ceci dans viewWillDisappear: de votre controller de vue actuel.

Mettez ce code dans votre viewDidLoad :

 self.definesPresentationContext = YES; 

Après avoir essayé de traiter le même problème pendant quelques jours, j'ai réalisé que la manière correcte de faire ceci est d'avoir un controller de navigation qui contient tout dans la hiérarchie de search.

comme ça :

  • Navigation 1 (pas de barre de navigation)
  • (…. barre d'onglet, autre chose …)
  • Navigation 2 (possède une barre de navigation, cette barre de navigation est remplacée par la barre de search
  • Contrôleur de table

lorsque vous poussez le controller de détails, vous le poussez dans la navigation 1, affichant sa barre de navigation en même time.

Cela laisse la stack de search intacte et prête à fonctionner lorsque vous click "return" sur la page de détails