UISearchController不会按预期显示

Seb*_*ien 5 uitableview ios swift uisearchcontroller

我正在尝试将UISearchController添加到包含UITableView(以及MKMapView的UIViewController)中,但希望这不是问题。我遵循了Ray Wenderlich的教程,但是就行为而言,我无法获得相同的结果。

这是我的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
    }
Run Code Online (Sandbox Code Playgroud)

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

现在我看到几个问题:

  • 搜索栏立即显示,我无法通过滚动隐藏它
  • 当我聚焦搜索栏时,表格视图的顶部不会粘在导航项目的底部:

在此处输入图片说明

我在Ray Wenderlich的示例项目中看到的唯一主要区别是,由于我使用Xcode 9创建了项目,因此故事板不使用顶部和底部布局指南,而是使用安全区域。不知道它是否相关,但这是我唯一看到的。

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

Dor*_*lan 6

如果您需要支持高达 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
}
Run Code Online (Sandbox Code Playgroud)

如果这无助于按预期显示,我几乎可以肯定问题出在您的布局约束上。如果您无法使您的布局符合安全区域,请添加您当前的约束。