UISearchBar detect when user stop type in swift

帅比萌擦擦* 提交于 2019-12-12 08:13:40

问题


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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!