【问题标题】:UISearchBar disappears on cancelUISearchBar 在取消时消失
【发布时间】: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?我试过true 和false。 False 导致搜索栏即使在导航到下一个视图控制器(push segue)后仍保留在屏幕上。
  • 是的,你是对的。正是我在控制器中看到的这个问题。从子控制器返回后,您可以检查navigationBar.translucent 的值吗?也许子控制器设置了一个值navigationBar.translucent 到false?

标签: ios uitableview uisearchbar uisearchcontroller


【解决方案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()
    }
    

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-21
      • 2014-01-20
      • 1970-01-01
      • 2015-10-22
      • 1970-01-01
      • 2017-03-25
      • 1970-01-01
      • 2014-01-22
      相关资源
      最近更新 更多