UISearchController未按预期显示

时间:2017-11-24 09:09:20

标签: ios swift uitableview uisearchcontroller

我试图将UISearchController添加到包含UITableView的UIViewController(以及MKMapView,但希望这不是问题)。我跟着Ray Wenderlich's tutorial但我在行为方面得不到相同的结果。

这是我的viewDidLoad:

override func viewDidLoad() {
        super.viewDidLoad()

        // Setup the Search Controller
        searchController.searchResultsUpdater = self
        searchController.obscuresBackgroundDuringPresentation = false
        searchController.searchBar.placeholder = NSLocalizedString("Search references by project, customer or city", comment: "")
        if #available(iOS 11.0, *) {
            navigationItem.searchController = searchController
            navigationItem.hidesSearchBarWhenScrolling = true
        } else {
            tableView.tableHeaderView = searchController.searchBar
        }
        definesPresentationContext = true

        self.modeSelector.layer.cornerRadius = 5.0

        if let split = splitViewController {
            let controllers = split.viewControllers
            detailViewController = (controllers[controllers.count - 1] as! UINavigationController).topViewController as? ReferenceViewController
        }

        self.navigationItem.rightBarButtonItem?.isEnabled = false
    }

请注意,中间的#available测试是因为我需要支持最多9.1的iOS。

现在我看到了几个问题:

  • 搜索栏会立即显示,我无法通过滚动
  • 隐藏它
  • 当我关注搜索栏时,桌面视图的顶部并未贴在导航项的底部:

enter image description here

我在Ray Wenderlich的示例项目中看到的唯一主要区别是,自从我使用XCode 9创建项目以来,我的故事板并没有使用顶部和底部布局指南,而是安全区域。不知道它是否相关,但这是我唯一看到的。

知道发生了什么以及如何解决这个问题?

2 个答案:

答案 0 :(得分:3)

如果您需要支持最高9.1的iOS,您可能使用版本低于9.1的版本。因此,"可能" obscuresBackgroundDuringPresentation无法正常影响searchController,因为它仅适用于iOS 9.1或更高版本。添加dimsBackgroundDuringPresentation以支持最多9.1:

if #available(iOS 9.1, *) {
    searchController?.obscuresBackgroundDuringPresentation = false
} else {
    searchController?.dimsBackgroundDuringPresentation = false
}

如果这没有按预期显示,我几乎可以肯定问题与布局限制有关。如果您的布局不符合安全区域,请添加当前的限制。

答案 1 :(得分:0)

如果您使用的是xcode 9(ios 11)。然后你真正想做的事情是 - 使用新的Broader导航栏,这是ios 11设备中的新亮点。但由于有许多人没有转向ios-11,因此也考虑了以前的版本设备。 为了将搜索栏添加到较新的导航栏,我使用了以下功能,该功能在滚动时提供搜索栏,并在用户滚动页面时隐藏它。

func addSearchBar() {
if #available(iOS 11.0, *) {
  let sc = UISearchController(searchResultsController: nil)
  sc.delegate = self
  let scb = sc.searchBar
  scb.tintColor = UIColor.white
  scb.barTintColor = UIColor.white
  //Change the colors as you like them
  if let textfield = scb.value(forKey: "searchField") as? UITextField {
    textfield.textColor = UIColor.blue
    if let backgroundview = textfield.subviews.first {

      // Background color
      backgroundview.backgroundColor = UIColor.white

      // Rounded corner
      backgroundview.layer.cornerRadius = 10;
      backgroundview.clipsToBounds = true;
    }
  }

  if let navigationbar = self.navigationController?.navigationBar {
    navigationbar.barTintColor = UIColor.white
  }
  navigationItem.searchController = sc
  navigationItem.hidesSearchBarWhenScrolling = true
}else{
//add the logic for previous version devices here.
}

我也设定了 viewDidLoad中的self.navigationController?.navigationBar.prefersLargeTitles = true;因为xcode9中存在错误并且从界面构建器设置它不起作用。

以下方法取自here