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
【讨论】:
已编辑,替换为() -> Void
以上是关于UISearchBar 检测用户何时停止快速输入的主要内容,如果未能解决你的问题,请参考以下文章
检测用户何时停止/暂停在 TextField 中写入 - SwiftUI