在UINavigationBar中添加UISearchBar与UIBarButtonItem

5

我的应用程序中,我曾经在表视图的标题视图中使用搜索栏。然而,我添加了一个搜索栏按钮项,当用户点击它时,我希望一个搜索栏动画穿过导航栏,并且用户可以进行搜索。这有点像 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

    })()

这是我当前的UINavigationBar的外观:enter image description here

我应该如何实现这个效果呢?


我在这里精确回答了这个问题 http://stackoverflow.com/questions/32259863/ios-search-bar-in-navigation-bar/32260397#32260397 - Victor Sigler
@VictorSigler,我看了你对类似问题的回答。实际上,我想让我的搜索栏出现在与uibarbuttonitem相同的视图控制器中。那么,在IBAction中我该怎么做呢?我尝试通过在barbuttonitem的方法中将导航栏的titleView设置为搜索栏来实现这一点,但它没有起作用。 - Rehaan Advani
1个回答

7
你已经接近成功了。你需要完成四个步骤:
  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()

这将确保当UISearchBar成为第一响应者时,它将使用整个UINavigationBar。您还可以获得UISearchBar动画效果,它可以很好地隐藏UIBarButtonItems的未加动画的移除过程。

您需要实现UISearchBarDelegate(或如果您喜欢,可以使用UISearchControllerDelegate)以在用户完成搜索后恢复原始导航栏状态。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接