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)

questionAnswers(2)

yourAnswerToTheQuestion