UISearchBar 在取消时消失

UISearchBar disappears on cancel

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

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

这个包含 table(和地图视图)的视图控制器是应用根导航控制器的顶层视图控制器。

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

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

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

self.tableView.headerView = self.searchController.searchBar

在 viewDidAppear() 中,但这只在我点击搜索栏的 'cancel' 按钮之前有效(此时,它再次消失 - 范围按钮折叠动画结束后 ).

我见过很多类似的问题,但 none 描述了我的确切症状,以及 none 解决方案(或我能想到的任何其他问题):

// In viewDidLoad():

self.definesPresentationContext = true

self.searchController.definesPresentationContext = true

self.extendedLayoutIncludesOpaqueBars = true

self.navigationController?.extendedLayoutIncludesOpaqueBars = true

self.navigationController?.navigationBar.translucent = true

...似乎对我有用。

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

我知道我一定漏掉了什么...

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

func searchBarTextDidEndEditing(searchBar: UISearchBar)
{
    // Dismiss the keyboard
    self.resultSearchController.resignFirstResponder()

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

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

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

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

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
    }
  }
}

注意:对于 iOS11 或更高版本,搜索栏设置为导航项。