Exibir a barra de pesquisa do UISearchController programaticamente
Nota 1: Esta pergunta refere-se à adição da barra de pesquisa de um UISearchController fora da exibição de tabela que ele atualiza - NÃO como o cabeçalho da exibição de tabela.
Nota 2: Algumas tentativas e erros me levaram a uma solução. Por favor veja meuresponda abaixo.
Eu sou novo no desenvolvimento do iOS e estou lutando para trabalhar com a classe UISearchController. Eu tenho um controlador de exibição e, na exibição do meu controlador de exibição, pretendo ter uma barra de pesquisa acima de uma exibição de tabela. Gostaria que a barra de pesquisa estivesse vinculada a um UISearchController. Como o construtor de interface não vem com um UISearchController, estou adicionando o controlador programaticamente. Após instanciar um UISearchController, tentei adicionar a barra de pesquisa do controlador de pesquisa à minha exibição programaticamente, mas não obtive sucesso. Tentei definir o quadro da barra de pesquisa e restringir o layout automático, mas nenhuma abordagem funcionou para mim (ou seja, quando executo o aplicativo, nada aparece). Aqui está o código mais recente que eu tentei:
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)
Qualquer ajuda seria muito apreciada! Obrigado!
EDITAR: O uso de apenas uma das configurações do quadro da barra de pesquisa ou a concessão de restrições de autolayout (em oposição a uma combinação que eu tentei inicialmente) parece funcionar primeiro, mas depois de tocar na barra de pesquisa, você terá problemas como apontado por Dwight . Deixei o código para esses casos, caso seja útil comparar com o que você tem atualmente, mas para uma solução funcional, veja minha resposta abaixo.
Usando restrições de execução automática:
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])
Eu configurei a constante topConstraint para a altura da barra de status mais a altura da barra de navegação, pois meu controlador de exibição está incorporado em um controlador de navegação.
Ajustando o quadro:
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)