UISearchBar 在取消时消失

Posted

技术标签:

【中文标题】UISearchBar 在取消时消失【英文标题】:UISearchBar disappears on cancel 【发布时间】:2015-11-10 10:19:27 【问题描述】:

我的应用是 iPad 横向,使用自动布局。

初始视图有一个只占屏幕一半的表格视图(另一半是 MapKit 视图)。

包含该表(和地图视图)的视图控制器是应用根导航控制器的顶部视图控制器。

在视图加载时,我实例化 UISearchController 并将其搜索栏添加到表视图的标题视图中,这是标准过程。

如果我点击搜索栏并输入一些文本,则会显示结果。如果我在这里取消搜索,没问题。

如果相反,我选择其中一个结果行,然后推入下一个屏幕,然后弹回来,搜索栏就消失了。我可以通过再次调用来恢复它:

self.tableView.headerView = self.searchController.searchBar

在 viewDidAppear() 中,但这仅在我点击搜索栏的“取消”按钮之前有效(此时,它会再次消失 - 范围按钮折叠动画结束后)。 p>

我见过很多类似的问题,但没有一个能描述我的确切症状,也没有一个解决方案(或任何我能想到的):

// In viewDidLoad():

self.definesPresentationContext = true

self.searchController.definesPresentationContext = true

self.extendedLayoutIncludesOpaqueBars = true

self.navigationController?.extendedLayoutIncludesOpaqueBars = true

self.navigationController?.navigationBar.translucent = true

...似乎对我有用。

最奇怪的是,我还有其他类似的带有搜索界面的表格视图(在模态视图控制器中显示),在配置方面我看不出有什么区别,而且这些工作正常...

我知道我一定错过了什么......

【问题讨论】:

我不确定,但我在制作自己的控制器时看到了类似的东西。尝试使用presentationContext 你的意思是definesPresentationContex?我试过truefalse。 False 导致搜索栏即使在导航到下一个视图控制器(push segue)后仍保留在屏幕上。 是的,你是对的。正是我在控制器中看到的这个问题。从子控制器返回后,您可以检查navigationBar.translucent 的值吗?也许子控制器设置了一个值navigationBar.translucentfalse 【参考方案1】:

我有类似的问题。有时,当点击取消按钮时,搜索栏也会消失。我发现如果搜索栏再次重置为表头,这可能会导致搜索栏消失。因此我有以下更新的代码来解决这个问题。

func setupSearchController(_ ctr: UISearchController?)  
  if let sc = car  // search bar is not nil
    if #available(ios 11.0, *) 
      navigationItem.searchController = sc
     else 
      // Fallback on earlier versions
      if tableView.tableHeaderView == nil 
        tableView.tableHeaderView = sc.searchBar
      
    
   else 
    if #available(iOS 11.0, *) 
      navigationItem.searchController = nil
     else 
      // Fallback on earlier versions
      tableView.tableHeaderView = nil
    
  

注意:iOS 11 或更高版本,搜索栏设置为导航项。

【讨论】:

【参考方案2】:

经过几个小时的尝试,我发现了有问题的代码:

func searchBarTextDidEndEditing(searchBar: UISearchBar)

    // Dismiss the keyboard
    self.resultSearchController.resignFirstResponder()

    // Reload of table data
    self.resultSearchController.loadView()

在注释掉这两行之后 - 或者更好的是,整个方法(因为我没有在其中做任何其他事情) - 问题自行解决了。

注意:我的一位同事在尝试不同的方法以使搜索按预期工作时实现了该方法,但不知何故卡住了...

【讨论】:

以上是关于UISearchBar 在取消时消失的主要内容,如果未能解决你的问题,请参考以下文章

UISearchBar - 当点击取消按钮时,如何防止关闭 scopeBar?

UISearchBar 取消

为啥在 UISearchBar 上输入时 UISearchController 会消失?

使用 UISegmentControl 切换视图时 UISearchBar 消失

使用APICloud AVM多端组件快速实现app中的搜索功能

让 UISearchBar 像 Music App 一样消失