J'essaie d'ajouter un UISearchController à un UIViewController qui contient un UITableView (et un MKMapView aussi, mais j'espère que ce n'est pas le problème). J'ai suivi le tutoriel de Ray Wenderlich mais je ne parviens pas à obtenir le même résultat en termes de comportement.

Voici mon viewDidLoad:

override func viewDidLoad() {
        super.viewDidLoad()

        // Setup the Search Controller
        searchController.searchResultsUpdater = self
        searchController.obscuresBackgroundDuringPresentation = false
        searchController.searchBar.placeholder = NSLocalizedString("Search references by project, customer or city", comment: "")
        if #available(iOS 11.0, *) {
            navigationItem.searchController = searchController
            navigationItem.hidesSearchBarWhenScrolling = true
        } else {
            tableView.tableHeaderView = searchController.searchBar
        }
        definesPresentationContext = true

        self.modeSelector.layer.cornerRadius = 5.0

        if let split = splitViewController {
            let controllers = split.viewControllers
            detailViewController = (controllers[controllers.count - 1] as! UINavigationController).topViewController as? ReferenceViewController
        }

        self.navigationItem.rightBarButtonItem?.isEnabled = false
    }

Notez que le test #available au milieu est dû au fait que je dois prendre en charge iOS jusqu'à 9.1.

Maintenant, je vois plusieurs problèmes:

  • La barre de recherche apparaît tout de suite et je ne peux pas la masquer en faisant défiler
  • Lorsque je concentre la barre de recherche, le haut de la vue du tableau ne colle pas au bas de l'élément de navigation:

enter image description here

La seule différence majeure que je vois avec l'exemple de projet de Ray Wenderlich est que depuis que j'ai créé mon projet avec Xcode 9, mon storyboard n'utilise pas les guides de mise en page haut et bas, mais des zones sûres. Je ne sais pas si c'est pertinent, mais c'est la seule chose que je vois.

Une idée de ce qui se passe et comment je pourrais résoudre ce problème?

5
Sebastien 24 nov. 2017 à 12:09

3 réponses

Meilleure réponse

Si vous devez prendre en charge iOS jusqu'à 9.1, vous utilisez probablement un émulateur avec une version antérieure à 9.1. Par conséquent, "peut-être" obscuresBackgroundDuringPresentation n'affecte pas correctement le searchController, car il n'est disponible que sur iOS 9.1 ou plus récent. Ajoutez dimsBackgroundDuringPresentation pour prendre en charge jusqu'à 9.1:

if #available(iOS 9.1, *) {
    searchController?.obscuresBackgroundDuringPresentation = false
} else {
    searchController?.dimsBackgroundDuringPresentation = false
}

Si cela n'aide pas à s'afficher comme prévu, je suis presque sûr que le problème concerne vos contraintes de mise en page. Veuillez ajouter vos contraintes actuelles si vous ne parvenez pas à mettre votre disposition en conformité avec la zone de sécurité.

6
Dorukhan Arslan 3 déc. 2017 à 08:38

Si vous utilisez xcode 9 (ios 11). Ensuite, la chose que vous voulez vraiment faire est - Utilisez les nouvelles barres de navigation plus larges qui sont les nouveaux points forts des appareils ios 11. Mais comme il y en a beaucoup qui ne sont pas passés à ios-11, les appareils de la version précédente sont également pris en compte. Pour ajouter la barre de recherche aux nouvelles barres de navigation, j'ai utilisé la fonction suivante qui donne une barre de recherche sur le défilement et la masque lorsque l'utilisateur fait défiler la page.

func addSearchBar() {
if #available(iOS 11.0, *) {
  let sc = UISearchController(searchResultsController: nil)
  sc.delegate = self
  let scb = sc.searchBar
  scb.tintColor = UIColor.white
  scb.barTintColor = UIColor.white
  //Change the colors as you like them
  if let textfield = scb.value(forKey: "searchField") as? UITextField {
    textfield.textColor = UIColor.blue
    if let backgroundview = textfield.subviews.first {

      // Background color
      backgroundview.backgroundColor = UIColor.white

      // Rounded corner
      backgroundview.layer.cornerRadius = 10;
      backgroundview.clipsToBounds = true;
    }
  }

  if let navigationbar = self.navigationController?.navigationBar {
    navigationbar.barTintColor = UIColor.white
  }
  navigationItem.searchController = sc
  navigationItem.hidesSearchBarWhenScrolling = true
}else{
//add the logic for previous version devices here.
}

J'ai également défini le self.navigationController?.navigationBar.prefersLargeTitles = true; dans viewDidLoad car il y a un bogue dans xcode9 et le paramétrer depuis le constructeur d'interface ne fonctionne pas (encore).

La méthode suivante est tirée de ici

0
Ramandeep Singh Gosal 27 nov. 2017 à 06:55

Utilisez cette ligne de code ci-dessous dans votre viewDidload

self.navigationController?.navigationBar.isTranslucent = false

J'espère que cela vous aidera

3
Ganesh Manickam 24 nov. 2017 à 12:40
47469788