UISearchBar 检测用户何时停止快速输入

Posted

技术标签:

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

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

【问题讨论】:

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

以上是关于UISearchBar 检测用户何时停止快速输入的主要内容,如果未能解决你的问题,请参考以下文章

检测用户何时停止/暂停在 TextField 中写入 - SwiftUI

jQuery scroll() 检测用户何时停止滚动

Swift:检测用户编辑的热点已在 UITextView 中停止

Android:检测 ScrollView 何时停止滚动

检测用户何时使用文件输入选择文件

如何检测用户何时在输入字段中按 Enter