Uwaga 1: To pytanie dotyczy dodania paska wyszukiwania UISearchController poza widokiem tabeli, który aktualizuje - NIE jako nagłówek widoku tabeli.Wyświetlanie paska wyszukiwania UISearchController programowo
Uwaga 2: Niektóre próby i błędy doprowadziły mnie do rozwiązania. Proszę zobaczyć mój answer poniżej.
Jestem nowy w rozwoju iOS i walczę o pracę z klasą UISearchController. Mam kontroler widoku, a moim zdaniem widok kontrolera, planuję mieć pasek wyszukiwania nad widokiem tabeli. Chciałbym, aby pasek wyszukiwania był połączony z kontrolerem UISearch. Ponieważ program budujący interfejs nie jest dostarczany z kontrolerem UISearch, dodam sterownik programowo. Po utworzeniu instancji UISearchController próbowałem programowo dodać pasek wyszukiwania kontrolera do mojego widoku, ale nie udało się. Próbowałem ustawić ramkę paska wyszukiwania i nadać mu ograniczenia związane z autolayout, ale żadne z tych rozwiązań nie zadziałało na mnie (tj. Po uruchomieniu aplikacji nic się nie wyświetla). Oto najnowszy kod, który wypróbowałem:
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)
Każda pomoc zostanie bardzo doceniona! Dziękuję Ci!
EDIT: Stosując tylko jeden albo ustawienie ramki pasku wyszukiwania lub dajesz to autoLayout ograniczeń (w przeciwieństwie do kombinacji zarówno jak początkowo próbował) wydaje się działać na początku, ale po wstawieniu na pasku wyszukiwania ciebie będą mieć problemy wskazane przez Dwighta. Zostawiłem kod dla tych przypadków na wypadek, gdyby pomocne było porównanie z tym, co aktualnie masz, ale dla działającego rozwiązania zobacz moją odpowiedź poniżej.
Korzystanie ograniczenia autoLayout:
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])
mam ustawić topConstraint stałej wysokości paska stanu powiększonej wysokości paska nawigacyjnego, jak mój widok kontroler jest wbudowany w kontroler nawigacji.
Regulacja Rama:
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)
spróbuj tego [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) może ci pomóc –
@ Anbu.Karthik dzięki za linki! Pierwszy wydaje się robić to, co chcę, z nieco większym zaangażowaniem budowniczego interfejsu, więc przyjrzę się bliżej. Po drugie używam UISearchDisplayController, który moim zdaniem jest nieaktualny od wersji iOS 8. – kcstricks
Zdarzyło mi się napotkać ten sam problem co ty, ale mam problem po tym, jak użytkownik kliknie na pasku wyszukiwania. W przypadku opcji ramki pasek wyszukiwania przesuwa się poza widok, a widok tabeli jest wyświetlany, ale nie jest poprawnie umiejscowiony. W przypadku opcji ograniczenia aplikacja ulega awarii przy pomocy "Hierarchia widoku nie jest przygotowana na ograniczenie": błąd po kliknięciu. Czy napotkaliście te problemy? – Dwight