以编程方式显示导航栏的 UISearchController
Posted
技术标签:
【中文标题】以编程方式显示导航栏的 UISearchController【英文标题】:Programmatically Show Navigation Bar's UISearchController 【发布时间】:2019-01-12 07:43:10 【问题描述】:我在viewDidLoad()
内配置了一个UISearchController
如下:
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
并将searchBar
设置为firstResponder
,但是当视图出现在屏幕上时,UISearchController 是不活动的。手动点击该字段可以正确打开它。
在 ios 12 中是否存在 isActive
和 becomeFirstResponder
属性在 viewDidLoad
中不受尊重的原因?
【问题讨论】:
【参考方案1】:不确定那里发生了什么,但它在导航栏中是独一无二的。
这似乎可以解决问题。
override func viewWillAppear(_ animated: Bool)
super.viewWillAppear(animated)
DispatchQueue.main.async(searchController.searchBar.becomeFirstResponder)
【讨论】:
使用DispatchQueue.main.async...
***.com/a/41992442/3231194时不需要弱自己【参考方案2】:
就我而言,在 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://***.com/a/53264329/3231194
【讨论】:
感谢您的回答,但希望不必延迟代码块的执行。 这取决于你。这不会冻结 UI,而且据我所知,这是呈现 searchBar 键盘的唯一方法。以上是关于以编程方式显示导航栏的 UISearchController的主要内容,如果未能解决你的问题,请参考以下文章