问题描述
我正在尝试在“设置”>“通用”>“iPhone 存储”>“搜索”中重新创建搜索屏幕。这是一个模态呈现的屏幕,导航栏中的 UISearchController
始终处于活动状态,键盘在屏幕出现后出现,点击“取消”会关闭屏幕而不是停用搜索模式。
我遇到的问题是在 viewDidAppear
之前我无法使搜索控制器处于活动状态,因此您可以在整个演示文稿中看到导航栏,然后搜索栏出现后向上移动到导航栏中.希望始终处于活动状态,但在 isActive = true
中设置 viewDidLoad
没有任何作用。我也尝试过 searchController.searchBar.becomeFirstResponder()
,但即使在 viewDidAppear
中也不起作用 - 必须通过 dispatchQueue.main.asyc
延迟。
有人指出 here 他们认为这是因为搜索界面尚未完全初始化或其他原因。我们如何像上面提到的设置屏幕那样创建一个始终处于活动状态的搜索控制器?
override func viewDidLoad() {
super.viewDidLoad()
searchController.delegate = self
searchController.searchResultsUpdater = self
searchController.obscuresBackgroundDuringPresentation = false
searchController.searchBar.delegate = self
navigationItem.searchController = searchController
definesPresentationContext = true
}
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
//FIXME: Works,but delay is undesirable - search controller should be active initially
searchController.isActive = true
//OR
dispatchQueue.main.async {
self.searchController.searchBar.becomeFirstResponder()
}
}
解决方法
在 vieDidLoad
或 viewWillAppear
DispatchQueue.main.async {
UIView.performWithoutAnimation {
self.searchController.isActive = true
}
}