UIsearchController不会成为ios 9中的第一响应者

时间:2015-10-28 09:10:19

标签: swift uisearchbar ios9 uisearchcontroller becomefirstresponder

我在导航栏中有一个UISearchController,它一直运行到现在。

仅在iOS 9上,搜索栏在加载控制器后拒绝成为第一个响应者。

viewDidLoad中的代码:

self.searchController = ({
        let controller = UISearchController(searchResultsController: nil)
        controller.searchResultsUpdater = self
        controller.delegate = self

        controller.dimsBackgroundDuringPresentation = false

        let ownSearchBar = controller.searchBar
        ownSearchBar.searchBarStyle = .Default
        ownSearchBar.barStyle = UIBarStyle.Black
        ownSearchBar.placeholder = NSLocalizedString("Search",  comment: "Search")
        ownSearchBar.showsCancelButton = true
        ownSearchBar.sizeToFit()
        ownSearchBar.delegate = self

        controller.searchBar.delegate = self
        controller.hidesNavigationBarDuringPresentation = false

        self.navigationItem.titleView = controller.searchBar
        self.navigationItem.hidesBackButton = true
        self.navigationController?.navigationBar.sizeToFit()


        return controller

    })()

viewDidAppear中的代码:

override func viewDidAppear(animated: Bool) {
    super.viewDidAppear(animated)

    self.searchController.active = true
    self.searchController.searchBar.text = state.term
    self.segmentedControl.selectedSegmentIndex = state.searchType
}

我的代码在didPresentSearchController

extension SearchController :  UISearchControllerDelegate {
func didPresentSearchController(searchController: UISearchController){
    self.searchController.searchBar.becomeFirstResponder()
    xButtonWasPressed = true
}

}

请帮助我找到为什么只有在iOS 9中搜索栏才能获得焦点

3 个答案:

答案 0 :(得分:3)

对我来说同样的问题。在iOS 8上运行良好但在iOS 9上停止工作。

错误是 didPresentSearchController:方法应该是已经加载的SearchController,但事实并非如此。

所以我们需要加载一些延迟。我的丑陋但有效的解决方案是

 func didPresentSearchController(searchController: UISearchController) {

    UIView.animateWithDuration(0.1, animations: { () -> Void in }) { (completed) -> Void in

         searchController.searchBar.becomeFirstResponder()
    }
}

在此方法的已完成部分中拥有 becomeFirstResponder()非常重要,因为它是加载SearchController时的部分

希望它有所帮助!

答案 1 :(得分:1)

有用的东西...

  1. 在 viewDidLoad 中将 self 设置为搜索栏的委托 searchController.delegate = self

  2. 在 viewDidAppear 中设置 self.searchController.isActive = true。如果您在 viewWillAppear 中执行此操作,则可能无法立即使用

  3. 使用 UISearchControllerDelegate 方法激活键盘


    func presentSearchController(_ searchController: UISearchController) {
        DispatchQueue.main.async {
                searchController.searchBar.becomeFirstResponder()
            }
    }
}

注意:有一个名为 didPresentSearchController 的方法,您可能会认为它是可以使用的方法,但只有在系统自动显示搜索栏时才会触发。

答案 2 :(得分:0)

使用以下代码:

override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)            
        self.countrySearchBar.becomeFirstResponder()
    }

这里" countrySearchBar"是您的搜索栏的出口。

请检查我的GitHub链接以测试示例项目:

https://github.com/k-sathireddy/SearchDisplayControllerSample