使用UIBarButtonItem将UISearchBar添加到UINavigationBar

Reh*_*ani 4 uinavigationbar uinavigationcontroller uisearchbar ios swift

在我的应用中,我以前在表格视图的标题视图中有一个搜索栏。但是,我添加了一个搜索栏按钮项,并且当用户点击它时,我希望搜索栏在整个导航栏中设置动画,并且用户应该能够搜索。这有点像Twitter iOS应用中的搜索栏。这是我的UISearchController的代码:

self.searchController = ({
        let controller = UISearchController(searchResultsController: nil)
        controller.searchResultsUpdater = self
        controller.hidesNavigationBarDuringPresentation = true
        controller.dimsBackgroundDuringPresentation = false
        controller.searchBar.sizeToFit()
        //self.tableView.tableHeaderView = controller.searchBar
        self.definesPresentationContext = true
        controller.searchBar.returnKeyType = .Search
        controller.searchBar.delegate = self

        return controller

    })()
Run Code Online (Sandbox Code Playgroud)

这是我的UINavigationBar现在的样子: 在此处输入图片说明

我将如何去做呢?

小智 6

你快到了。您需要做四件事:

  1. searchController.hidesNavigationBarDuringPresentation = false
  2. navigationItem.titleView = searchController.searchBar
  3. 隐藏导航栏中的所有当前UIBarButtonItems
  4. searchController.searchBar.becomesFirstResponder()

也就是说,您将UISearchController设置为不隐藏导航栏,因为UISearchBar将显示在其中。

然后,当您的IBAction运行时,您将执行以下操作:

navigationItem.hidesBackButton = true
navigationItem.titleView = searchController.searchBar
navigationItem.rightBarButtonItem = nil
searchController.searchBar.becomeFirstResponder()
Run Code Online (Sandbox Code Playgroud)

这样可以保证UISearchBar在成为第一响应者时将使用整个UINavigationBar。您还将获得UISearchBar动画,它可以很好地隐藏UIBarButtonItems的无动画移除。

一旦用户完成搜索,您将需要实现UISearchBarDelegate(或者如果您更喜欢UISearchControllerDelegate)来恢复原始导航栏状态。

一个非常重要的细节是,为了使UISearchBar在titleView中可编辑,在推入您的视图时,不能使用definePresentationContext = true设置其他视图控制器。