UISearchController désactiver annuler UIBarButtonItem
Le Problème
Je suis en train d'utiliser UISearchController à la recherche d'une destination sur une carte. Je veux le UISearchBar à apparaître dans la barre de navigation, mais je n'arrive pas à faire faire sans lui montrant un bouton annuler situé sur la droite de celui-ci:
Ce bouton Annuler a disparu au temps, alors que je suis en train de jouer autour, mais je ne peux pas le faire pour ne pas apparaître maintenant, j'ai la table de recherche montrant comment je le veux:
Je suis sûre qu'il doit être quelque chose de petit, je fais un peu de mal, mais je ne peux pas savoir ce que c'est...
Mon Code
self.resultsViewController = [UITableViewController new];
self.searchController = [[UISearchController alloc] initWithSearchResultsController:self.resultsViewController];
self.searchController.searchResultsUpdater = self;
self.searchController.hidesNavigationBarDuringPresentation = false;
self.searchController.delegate = self;
self.searchBar = self.searchController.searchBar;
self.searchBar.placeholder = self.stage.title;
self.searchBar.searchBarStyle = UISearchBarStyleMinimal;
self.definesPresentationContext = true;
self.navigationItem.titleView = self.searchBar;
self.resultsTableView = self.resultsViewController.tableView;
self.resultsTableView.dataSource = self;
self.resultsTableView.delegate = self;
- Hey, je ne peux pas répondre à votre question, mais actuellement, je suis en train d'essayer d'obtenir les mêmes fonctionnalités de travail que vous venez de faire. Je me demande comment il est possible d'utiliser les UiSearchBar sans uitableView pour créer une liste de suggestion pour les adresses comme vous l'avez fait. Pourriez-vous donner quelques exemples de code?
InformationsquelleAutor simonthumper | 2015-02-08
Vous devez vous connecter pour publier un commentaire.
Mis à jour à la lumière des commentaires
UISearchBar
a une propriété (voir la Apple docs) qui détermine si le bouton annuler est affiché:Mais, comme par OP commentaires, cela ne fonctionne pas, parce que le searchController garde de commutation sur le bouton annuler de retour sur. Pour éviter cela, créez une sous-classe de UISearchBar, et de remplacer les
setShowsCancelButton
méthodes:Pour assurer cette sous-classe est utilisée par le searchController, nous avons aussi besoin de sous-classe
UISearchController
, et de remplacer lessearchBar
méthode pour retourner une instance de notre sous-classe. Nous devons également nous assurer que la nouvelle barre de recherche active la searchController - j'ai choisi d'utiliser leUISearchBarDelegate
méthodetextDidChange
pour cela:Enfin, modifiez votre code pour instancier cette sous-classe:
(Vous aurez évidemment besoin d'importer pertinentes fichiers d'en-tête de ces sous-classes).
Il y a un moyen plus simple...
Pour iOS 8, et UISearchController, l'utilisation de cette méthode du délégué de
UISearchControllerDelegate
:N'oubliez pas de mettre vous-même en tant que délégué:
searchController.delegate = self
Solution facile pour Swift3 - nous besoin de faire CustomSearchBar sans bouton annuler, puis remplacer la propriété correspondante à new CustomSearchController:
Dans MyViewController j'ai initialiser et configurer searchController à l'aide de cette nouvelle sous-classe personnalisée:
Et qu'il fonctionne correctement et en douceur
Vous pouviez faire comme ceci:
@pbasdf's réponse œuvres, pour la plupart, mais la vérification de la
searchText
longueur pour déterminer si leUISearchController
est active peut ajouter plus de travail à l'utilisateur. Le coin, ce serait le cas si l'utilisateur appuie sur la clair bouton, ou supprime le seul personnage dans la barre de recherche. Ce seraitactive
àNO
, qui serait automatiquement appelresignFirstResponder
sur leUISearchBar
. Le clavier disparaissent et si l'utilisateur veut modifier le texte ou le texte saisi, il aurait besoin d'appuyer à nouveau sur la barre de recherche.Au lieu de cela, j'ai seulement mis
active
àNO
si la barre de recherche n'est pas le premier intervenant (clavier n'est pas actif et affiche), puisque c'est effectivement un annuler commande.FJSearchBar
Marquage
searchController.searchBar.showsCancelButton = NO
ne semble pas fonctionner dans iOS 8. Je n'ai pas testé iOS 9.FJSearchBar.h
Vide, mais placé ici par souci d'exhaustivité.
FJSearchBar.m
FJSearchController
Voici où vous voulez vous rendre de réels changements. J'ai divisé le
UISearchBarDelegate
dans sa propre catégorie, car, à mon humble avis, les catégories de rendre les classes plus propre et plus facile à maintenir. Si vous voulez garder le délégué au sein de la classe principale de l'interface/l'application, vous êtes plus que bienvenus pour le faire.FJSearchController.h
FJSearchController.m
De certaines des pièces remarque:
BOOL
les variables privées au lieu de propriétés, carsearchBar
est le premier intervenant. Si c'est non, alors nous avons fait de désactiver le contrôleur de recherche parce que le texte est vide et que nous ne sommes plus à la recherche. Si vous vraiment voulez être sûr, vous pouvez également vous assurer quesearchText.length == 0
.searchBar:textDidChange:
est invoquée avantsearchBarShouldBeginEditing:
, c'est pourquoi nous avons traité dans cet ordre.[self.searchResultsUpdater updateSearchResultsForSearchController:self];
àsearchBarSearchButtonClicked:
si vous voulez la recherche effectuée une fois que l'utilisateur appuie sur le de Recherche bouton.J'ai été en mesure d'obtenir la
UISearchBar
à se comporter comme souhaité sans sous-classement en appelantsetShowsCancelButton
dans un couple deUISearchBarDelegate
méthodes:Je l'appelle dans
textDidChange
etsearchBarCancelButtonClicked
. Voici ce que ma mise en œuvre ressemble: