问题
Most of the example I found is in Objective - C
which is very hard for me to understand can someone provide an example regarding this question in Swift
. Here is one solution but it is in Objective C
.
回答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:
Swift 5
Throttled search
Use NSObject.cancelPreviousPerformRequests
to cancel previous triggers.
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 version of your link:
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:
You have to check it using UISearchBarDelegate:
func searchBarTextDidEndEditing(searchBar: UISearchBar) {
//DO what you want
}
Remember to add:
searchBar.delegate = self
And his relative protocol:
UISearchBarDelegate
https://developer.apple.com/reference/uikit/uisearchbardelegate
That delegate : searchBarTextDidEndEditing
is called when the keyboard disappears, so add that code to your proj:
override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
self.view.endEditing(true)
}
回答5:
You could try this:
class WorkItem {
private var pendingRequestWorkItem: DispatchWorkItem?
func perform(after: TimeInterval, _ block: @escaping VoidBlock) {
// 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)
}
}
// to use
lazy var workItem = WorkItem()
func searchBar(_ searchBar: UISearchBar, textDidChange: String) {
// 0.5 == half second
workItem.perform(after: 0.5) {
//Have Stopped, do something.
}
}
References
Link 1 by swiftbysundell
Link 2 on github
来源:https://stackoverflow.com/questions/41059449/uisearchbar-detect-when-user-stop-type-in-swift