J'ai un simple UIViewController contenant un UITableView et je souhaite masquer la barre de recherche à l'intérieur de la barre de navigation lors du défilement de UITableView. J'ai trouvé
navigationItem.hidesSearchBarWhenScrolling = true
mais cela ne fonctionne pas. Existe-t-il un moyen de le faire fonctionner sur UIViewController?
3 Réponses :
Je suppose que lorsque vous entrez pour la première fois dans UIViewController
, UISearchBar
est masqué par défaut, étant donné que vous utilisez UISearchController
et que vous y accédez avec une icône de recherche ou quelque chose.
Dans ce cas, iOS par défaut ne cache pas le UISearchBar
et (le cache / le montre) en fonction de votre direction de défilement dans UITableView
maintenant comment résoudre ce .
Comme il n'y a rien que nous puissions faire pour annuler ce comportement, mais que nous pouvons avoir un peu de travail autour d'un peu mieux lorsqu'un utilisateur annule les bandes, nous définissons le UISearchController
sur nil code> pour le supprimer du
UIViewController
et lorsque l'utilisateur tape sur l'icône de recherche, nous lui redonnons une valeur et la montrons.
Remarque: Cette réponse suppose que vous l'implémentez de cette façon étant donné qu'il n'y a pas beaucoup de contexte ni de code dans la question.
Entrons dans le code.
func searchBarCancelButtonClicked(_ searchBar: UISearchBar) { // this function is available only in search bar delegate make sure to conform to it . self.navigationItem.searchController = nil }
Nous nous conformons maintenant à UISearchBarDelegate
pour accéder à l'action du bouton d'annulation.
func prepareSearchController() { //function to setup the SearchBar // Setup the Search Controller searchController.searchResultsUpdater = self searchController.searchBar.delegate = self searchController.obscuresBackgroundDuringPresentation = false searchController.searchBar.placeholder = "Search Items" navigationItem.searchController = searchController definesPresentationContext = true } @objc func openSearch() { // when user tap on the search icon prepareSearchController() self.navigationItem.searchController?.isActive = true }
Veuillez essayer cette approche
override func viewWillAppear(_ animated: Bool) { if #available(iOS 11.0, *) { navigationItem.hidesSearchBarWhenScrolling = false } } override func viewDidAppear(_ animated: Bool) { if #available(iOS 11.0, *) { navigationItem.hidesSearchBarWhenScrolling = true } }
Implémentation simple de SWIFT 4
Ajoutez le délégué
UISearchBarDelegate
à votre classeEnsuite, ajoutez cette fonction dans votre classe
func showSearchBar() { let searchController = UISearchController(searchResultsController: nil) searchController.searchBar.delegate = self searchController.dimsBackgroundDuringPresentation = false searchController.hidesNavigationBarDuringPresentation = true navigationItem.hidesSearchBarWhenScrolling = true //true for hiding, false for keep showing while scrolling searchController.searchBar.sizeToFit() searchController.searchBar.returnKeyType = UIReturnKeyType.search searchController.searchBar.placeholder = "Search here" navigationItem.searchController = searchController }Puis appelez la fonction dans votre
viewDidLoad()
J'adore comment cela fonctionne. Mais l'ajout de ceci à mon SearchBarDelegate crée simplement une autre barre de recherche.
n'ajoutez simplement pas de barre de recherche du storyboard, ou supprimez la première ligne de la barre de recherche.
quelle est la direction du défilement?
où tu as ajouté ça
Quel problème est survenu est résolu ou non?