以编程方式显示导航栏的UISearchController

时间:2019-01-12 07:43:11

标签: ios swift uinavigationcontroller uisearchcontroller

我在UISearchController中配置了viewDidLoad(),如下所示:

let searchController = UISearchController(searchResultsController: nil);
searchController.delegate = self;
searchController.searchResultsUpdater = self;
searchController.searchBar.delegate = self;

self.searchController.isActive = true;
self.searchController.searchBar.becomeFirstResponder();

self.navigationItem.searchController = searchController;

尽管我已将isActive设置为{{1},并将searchBar设置为firstResponder,但是当视图出现在屏幕上时,UISearchController不处于活动状态。手动点击该字段可以正确打开它。

iOS 12中有没有理由isActive中不考虑becomeFirstResponderviewDidLoad属性吗?

2 个答案:

答案 0 :(得分:1)

不确定那里发生了什么,但这是它在导航栏中的唯一之处。

这似乎可以解决问题。

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)

    DispatchQueue.main.async(searchController.searchBar.becomeFirstResponder)
}

答案 1 :(得分:0)

在我的情况下,在iOS 12.x中,我只是将becomeFirstResponder()放在viewDidAppear中,但有一点延迟,即 0.1秒。添加这样的延迟可以保证键盘的显示。

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

    self.definesPresentationContext = true

    DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
        self.searchController.searchBar.becomeFirstResponder()
    }
}

我希望这会有所帮助。

编辑:如果您支持iOS 10和11,那么我过去的这个回答可能会对您有所帮助。 https://stackoverflow.com/a/53264329/3231194