【问题标题】:Is it possible to change handling order of TableView and SearchBar Delegates?是否可以更改 TableView 和 SearchBar Delegates 的处理顺序?
【发布时间】:2021-10-20 17:54:02
【问题描述】:

我有自定义类,继承自 UISearchBar 并带有下拉表格视图,并且两个委托都与该类相关。

我注意到,UISearchBarDelegate 方法在 UITableViewDelegate 之前调用,但为了我的目标,我需要更改它。是否有可能以任何方式管理它们,或结合起来?

例如,如果用户在 searchField 之外点击,didEndEditing 方法将被触发,键盘将被隐藏,所以我也想隐藏我的tableView(它提供搜索建议),但有一种情况:当点击tableView 行时,它也会在didSelectRow 之前触发didEndEditing,而didSelectRow 将永远不会被调用,因为tableView 是隐藏的,实际上没有单元格。

如果我要从 didEndEditing 中删除关闭的 tableview,当用户点击其他地方时,我无法关闭它。

因此,如果可以先处理tableView 方法,那将对我有很大帮助。也许,可以为他们使用一些通用协议..

       private func closeTableView() {
                var frame = self.tableView.frame
                frame.size.height = 0
                self.tableView.frame = frame
                self.tableView.sizeToFit()
            }
    ...
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
            print("didSelectRowAt")
...        
            self.closeTableView() 
       
        }
    
    extension CustomSearchBar: UISearchBarDelegate {
    
        ...
    
        func searchBarTextDidEndEditing(_ searchBar: UISearchBar) {
          print("searchBarTextDidEndEditing")            
          self.setShowsCancelButton(false, animated: true)
          self.closeTableView()
        }
    }

当点击表格行时,控制台中只有:

    searchBarTextDidEndEditing

【问题讨论】:

    标签: ios swift uitableview uisearchbardelegate


    【解决方案1】:

    您无法更改委托调用的顺序。但是您可以在真正关闭表格视图之前稍等片刻:

    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 等待下一个 runloop 循环就足够了。由于键盘和表格视图布局,我不确定这里是否会出现这种情况,所以如果这不起作用,请添加 DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) 而不是 DispatchQueue.main.async

    【讨论】:

    • 太好了,谢谢! DispatchQueue.main.async 完美运行!你让我免于检测触摸位置等,谢谢你的时间!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-09
    • 2010-10-06
    • 2019-06-09
    • 2010-09-12
    相关资源
    最近更新 更多