我有一個自定義的類,從UISearchBar繼承而來,帶有下拉式表視圖,并且兩個委托都與這個類有關。
我注意到,UISearchBarDelegate方法在UITableViewDelegate之前呼叫,但為了我的目標,我需要改變它。是否有可能管理它們,或者將它們結合起來?
例如,如果用戶在searchField之外點擊,didEndEditing方法將被觸發,鍵盤將被隱藏,所以我想把我的tableView也隱藏起來(它提出搜索建議),但是有一種情況。當點擊tableView行時,它也會觸發didEndEditing,在didSelectRow之前,它將永遠不會被呼叫,因為tableView被隱藏了,而且實際上沒有單元。
如果我從 didEndEditing 中移除關閉 tableview,那么當用戶點擊其他地方時,我就無法關閉它。
因此,如果有可能首先處理tableView方法,這將對我有很大的幫助。也許,可以使用一些通用的協議來處理它們。
private func closeTableView() {
var frame = self.tableView.fram
frame.size.height = 0.
self.tableView.frame = frame
self.tableView.sizeToFit()
}
...
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
print("didSelectRowAt"/span>)
...。
self.closeTableView()
}
extension CustomSearchBar。UISearchBarDelegate {
....
func searchBarTextDidEndEditing(_ searchBar: UISearchBar) {
print("searchBarTextDidEndEditing"/span>)
self.setShowsCancelButton(false, animated: true)
self.closeTableView()
}
}
而當點擊表格行時,在控制臺中只有:
searchBarTextDidEndEditing
uj5u.com熱心網友回復:
你不能改變委托呼叫的順序。但是你可以在真正關閉你的表視圖之前等待一下:
private var closeTableViewNeeded = false<
private func setNeedsCloseTableView(){
guard !closeTableViewNeeded else { return }
closeTableViewNeeded = true
DispatchQueue.main.async { [self] in
closeTableViewNeeded = false
closeTableView()
}
}
并且呼叫setNeedsCloseTableView()而不是closeTableView
通常情況下,用DispatchQueue.main.async等待下一個運行回圈周期就足夠了。由于鍵盤和表視圖的布局,我不確定這里是否會出現這種情況,所以如果這不起作用,請添加DispatchQueue.main.asyncAfter(deadline: .now() 0.1)而不是DispatchQueue.main.async
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/311731.html
標籤:
