【问题标题】:UISearchBar detect when user stop type in swiftUISearchBar 检测用户何时停止快速输入
【发布时间】:2016-12-09 11:29:42
【问题描述】:

我发现的大多数示例都在Objective - C 中,我很难理解有人可以在Swift 中提供有关此问题的示例。 Here 是一种解决方案,但它位于 Objective C 中。

【问题讨论】:

  • 问清楚点好让别人明白!!您可以分享您提到的目标c的链接链接!
  • 好的,我会编辑我的问题。
  • 你试过 searchBarTextDidEndEditing 和 searchBarShouldEndEditing 吗??
  • 当用户输入并排搜索时,是吗?为此,您必须制作自定义搜索栏。
  • 你为什么要这样做,它会降低你的应用程序性能

标签: ios swift uisearchbar


【解决方案1】:
func searchBar(searchBar: UISearchBar, textDidChange searchText: String) {
    print("after every text gets changed")
    timer.invalidate()
    timer = NSTimer.scheduledTimerWithTimeInterval(5, target: self, selector: #selector(ViewController.output), userInfo: searchText, repeats: false)
}

func output(){
    print("hello")
    if timer.userInfo != nil {
        print(timer.userInfo)
    }
    timer.invalidate()
}

【讨论】:

  • 这就是我解决问题的方法...谢谢大家的好意建议:)
  • 非常聪明的解决方案。我正在寻找异步功能以及如何杀死以前的异步任务。这一个更容易和直观。谢谢。
【解决方案2】:

斯威夫特 5

限制搜索

使用NSObject.cancelPreviousPerformRequests 取消之前的触发器。

func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
    NSObject.cancelPreviousPerformRequests(withTarget: self, selector: #selector(ViewController.reload), object: nil)
    self.perform(#selector(ViewController.reload), with: nil, afterDelay: 0.5)
}
    
@objc func reload() {
    guard let searchText = searchBar.text else { return }
    search(searchText)
}

【讨论】:

    【解决方案3】:

    您的链接的 Swift 版本:

    var searchDelayer: Timer!
    
    func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
        searchDelayer.invalidate(), searchDelayer = nil
        if true {
            searchDelayer = Timer.scheduledTimer(timeInterval: 1.5, target: self, selector: #selector(self.doDelayedSearch), userInfo: searchText, repeats: false)
        }
    }
    
    func doDelayedSearch(_ t: Timer) {
        assert(t == searchDelayer)
        self.request(searchDelayer.userInfo!)
        searchDelayer = nil
    }
    
    
    
    
    var priorSearchText = ""
    
        func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
            NSObject.cancelPreviousPerformRequests(withTarget: self, selector: #selector(self.request), object: priorSearchText)
            priorSearchText = searchText
        }
        if true {
            self.performSelector(#selector(self.request), withObject: searchText, afterDelay: 1.5)
        }
    

    【讨论】:

    • 您在这里向我们展示了执行此任务的两种不同方法,我说得对吗?
    【解决方案4】:

    您必须使用 UISearchBarDelegate 进行检查:

    func searchBarTextDidEndEditing(searchBar: UISearchBar) {
        //DO what you want
    }
    

    记得添加:

    searchBar.delegate = self
    

    还有他的相关协议:

    UISearchBarDelegate
    

    https://developer.apple.com/reference/uikit/uisearchbardelegate

    该委托:searchBarTextDidEndEditing 在键盘消失时被调用,因此将该代码添加到您的项目中:

    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
        self.view.endEditing(true)
    }
    

    【讨论】:

    • func searchBarTextDidEndEditing(searchBar: UISearchBar) { print("Type End");最初我做了同样的事情,但是当类型结束后,值不会打印在控制台中,所以我认为这不起作用。
    • 你必须添加:searchBar.delegate = self
    • override func viewDidLoad() { super.viewDidLoad() // 加载视图后做任何额外的设置,通常是从一个笔尖。 /* 设置委托 */ tableView.delegate = self tableView.dataSource = self searchBar.delegate = self } 是的,我已经提到过。
    • 查看新答案
    • 这不是一个好的答案。他不想关闭键盘,他只想通知系统他已经停止输入。
    【解决方案5】:

    你可以试试这个:

    class WorkItem {
    
    private var pendingRequestWorkItem: DispatchWorkItem?
    
    func perform(after: TimeInterval, _ block: @escaping () -> Void) {
        // Cancel the currently pending item
        pendingRequestWorkItem?.cancel()
    
        // Wrap our request in a work item
        let requestWorkItem = DispatchWorkItem(block: block)
    
        pendingRequestWorkItem = requestWorkItem
    
        DispatchQueue.main.asyncAfter(deadline: .now() + after, execute: requestWorkItem)
    }
    }
    

    // 使用

    lazy var workItem = WorkItem()
    
    func searchBar(_ searchBar: UISearchBar, textDidChange: String) {
    
        // 0.5 == half second
        workItem.perform(after: 0.5) {
    
           //Have Stopped, do something.
        }
    }
    

    参考文献

    Link 1 by swiftbysundell

    Link 2 on github

    【讨论】:

    • 已编辑,替换为() -&gt; Void
    猜你喜欢
    • 1970-01-01
    • 2012-03-27
    • 1970-01-01
    • 2015-06-28
    • 1970-01-01
    • 2021-05-29
    • 2011-10-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多