Ios 以编程方式显示导航栏';s UISearchController

Ios 以编程方式显示导航栏';s UISearchController,ios,swift,uinavigationcontroller,uisearchcontroller,Ios,Swift,Uinavigationcontroller,Uisearchcontroller,我在viewdiload()中配置了uisearch控制器,如下所示: 虽然我已将设置为活动的,并将搜索栏设置为第一响应者,但当视图显示在屏幕上时,UISearchController未处于活动状态。手动点击该字段可正确打开该字段 在iOS 12中,isActive和becomeFirstResponder属性在viewDidLoad中不受尊重有什么原因吗?不确定那里发生了什么,但它在导航栏中是独一无二的 不过,这似乎奏效了 override func viewWillAppear(_ anim

我在
viewdiload()中配置了
uisearch控制器
,如下所示:

虽然我已将
设置为活动的
,并将
搜索栏
设置为第一响应者
,但当视图显示在屏幕上时,UISearchController未处于活动状态。手动点击该字段可正确打开该字段


在iOS 12中,
isActive
becomeFirstResponder
属性在
viewDidLoad
中不受尊重有什么原因吗?

不确定那里发生了什么,但它在导航栏中是独一无二的

不过,这似乎奏效了

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

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

在我的例子中,在iOS 12.x中,我只是将
becomeFirstResponder()
放在
视图中,稍微延迟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和iOS 11,我过去的这个答案可能会帮助你

使用
DispatchQueue.main.async…
时不需要弱self,谢谢您的回答,但不希望延迟代码块的执行。这取决于您。这不会冻结用户界面,我知道,这是展示搜索栏键盘的唯一方式。
override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)

    self.definesPresentationContext = true

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