Nota 1: Questa domanda riguarda l'aggiunta di una barra di ricerca di UISearchController al di fuori della tabella per visualizzare gli aggiornamenti, NON come intestazione della vista tabella.Visualizza la barra di ricerca di UISearchController a livello di codice
Nota 2: Alcuni tentativi ed errori mi hanno portato a una soluzione. Si prega di consultare il mio answer qui sotto.
Sono nuovo nello sviluppo di iOS e sto faticando a lavorare con la classe UISearchController. Ho un controller di visualizzazione, e nella mia visualizzazione del controller di visualizzazione, ho intenzione di avere una barra di ricerca sopra una vista tabella. Vorrei che la barra di ricerca fosse collegata a un UISearchController. Poiché il generatore di interfacce non viene fornito con un UISearchController, aggiungo il controller a livello di codice. Dopo aver istanziato un UISearchController, ho provato ad aggiungere la barra di ricerca del controller di ricerca alla mia vista a livello di codice, ma non ho avuto successo. Ho provato a impostare il frame della barra di ricerca e a dargli dei vincoli di autolayout, ma nessuno dei due ha funzionato per me (cioè quando eseguo l'app, non appare nulla). Ecco l'ultimo codice che ho provato:
let searchController = UISearchController(searchResultsController: nil)
// Set the search bar's frame
searchController.searchBar.frame = CGRect(x: 0, y: 0, width: self.view.frame.size.width, height: 50)
// Constraint to pin the search bar to the top of the view
let topConstraint = NSLayoutConstraint(item: searchController.searchBar, attribute: NSLayoutAttribute.Top, relatedBy: NSLayoutRelation.Equal, toItem: self.view, attribute: NSLayoutAttribute.Top, multiplier: 1, constant: 0)
searchController.searchBar.setTranslatesAutoresizingMaskIntoConstraints(false)
self.view.addSubview(searchController.searchBar)
self.view.addConstraint(topConstraint)
Qualsiasi aiuto sarebbe molto apprezzato! Grazie!
EDIT: Utilizzando solo uno di una impostazione telaio della barra di ricerca o si dandogli layout automatico vincoli (in contrapposizione ad una combinazione sia come ho inizialmente provato) sembra funzionare in un primo momento, ma dopo toccando la barra di ricerca si avrà problemi come sottolineato da Dwight. Ho lasciato il codice per questi casi nel caso in cui sia utile fare un confronto con quello che hai attualmente, ma per una soluzione funzionante vedi la mia risposta qui sotto.
Uso vincoli layout automatico:
let searchController = UISearchController(searchResultsController: nil)
let topConstraint = NSLayoutConstraint(item: searchController.searchBar, attribute: NSLayoutAttribute.Top, relatedBy: NSLayoutRelation.Equal, toItem: self.view, attribute: NSLayoutAttribute.Top, multiplier: 1, constant: (statusBarHeight + navigationBarHeight!))
let leftConstraint = NSLayoutConstraint(item: searchController.searchBar, attribute: NSLayoutAttribute.Left, relatedBy: NSLayoutRelation.Equal, toItem: self.view, attribute: NSLayoutAttribute.Left, multiplier: 1, constant: 0)
let rightConstraint = NSLayoutConstraint(item: searchController.searchBar, attribute: NSLayoutAttribute.Right, relatedBy: NSLayoutRelation.Equal, toItem: self.view, attribute: NSLayoutAttribute.Right, multiplier: 1, constant: 0)
let heightConstraint = NSLayoutConstraint(item: searchController.searchBar, attribute: NSLayoutAttribute.Height, relatedBy: NSLayoutRelation.Equal, toItem: nil, attribute: NSLayoutAttribute.NotAnAttribute, multiplier: 1, constant: 44)
searchController.searchBar.setTranslatesAutoresizingMaskIntoConstraints(false)
searchController.searchBar.addConstraint(heightConstraint)
self.view.addSubview(searchController.searchBar)
self.view.addConstraints([topConstraint, leftConstraint, rightConstraint])
ho impostato il topConstraint costante l'altezza della barra di stato più l'altezza della barra di navigazione, come il mio controller della vista è incorporato in un controller di navigazione.
Regolazione del telaio:
let searchController = UISearchController(searchResultsController: nil)
searchController.searchBar.frame = CGRect(x: 0, y: (statusBarHeight + navigationBarHeight!), width: self.view.frame.size.width, height: 44)
self.view.addSubview(searchController.searchBar)
prova questo [link1] (http://shrikar.com/swift-ios-tutorial-uisearchbar-and-uisearchbardelegate/), [link2] (http://www.veasoftware.com/tutorials/2015/4/13/search-display-controller-in-swift-xcode-62-ios-82-tutorial) potrebbe esserti d'aiuto –
@ Anbu.Karthik grazie per i link! Il primo sembra fare proprio quello che voglio con un po 'più di coinvolgimento del builder dell'interfaccia, quindi darò un'occhiata più da vicino. Il secondo utilizza UISearchDisplayController, che a mio avviso è deprecato a partire da iOS 8. – kcstricks
Ho riscontrato il tuo stesso problema, tuttavia ho problemi dopo che l'utente ha toccato la barra di ricerca. Con l'opzione frame, la barra di ricerca scorre fuori dalla vista e la tableview viene mostrata ma non posizionata correttamente. Con l'opzione vincoli, l'app si arresta in modo anomalo con "La gerarchia della vista non è pronta per il vincolo:" errore una volta toccato. Hai incontrato anche questi problemi? – Dwight