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:
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?
3 réponses
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é.
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
Utilisez cette ligne de code ci-dessous dans votre viewDidload
self.navigationController?.navigationBar.isTranslucent = false
J'espère que cela vous aidera
Questions liées
De nouvelles questions
ios
iOS est le système d'exploitation mobile fonctionnant sur Apple iPhone, iPod touch et iPad. Utilisez cette balise [ios] pour les questions liées à la programmation sur la plate-forme iOS. Utilisez les balises associées [objective-c] et [swift] pour les problèmes spécifiques à ces langages de programmation.