我研究了stackoverflow,发现了我转换为Swift的解决方案,它似乎不起作用,选择器仍在执行。
func searchBar(searchBar: UISearchBar, textDidChange searchText: String) { self.filter.searchTerm = self.searchBar.text NSObject.cancelPreviousPerformRequestsWithTarget(self, selector: "getHints", object: nil) NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: "getHints", userInfo: nil, repeats: false) }
有没有更好的方法可以迅速做到这一点?谢谢!
更新2016/09/01:
我们可以使用NSTimers或(自2.0版本以来)的NSObject performSelector和朋友。
NSTimers
performSelector
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { NSObject.cancelPreviousPerformRequests( withTarget: self, selector: #selector(ViewController.getHintsFromTextField), object: textField) self.perform( #selector(ViewController.getHintsFromTextField), with: textField, afterDelay: 0.5) return true } func getHintsFromTextField(textField: UITextField) { print("Hints for textField: \(textField)") }
NSTimer
var timer: NSTimer? = nil func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { timer?.invalidate() timer = Timer.scheduledTimer( timeInterval: 0.5, target: self, selector: #selector(ViewController.getHints), userInfo: ["textField": textField], repeats: false) return true } func getHints(timer: Timer) { var userInfo = timer.userInfo as! [String: UITextField] print("Hints for textField: \(userInfo["textField"])") }
注意我将传递textField给延迟的函数。它并不总是必需的,但是当textField不易于访问或处理各种文本字段时,它可以使您的生活更轻松。
textField
调用performSelector目标时, 将 保留目标(快速移动时始终是目标self),但使用NSTimer目标时, 则不会 保留目标。这意味着,如果使用NSTimers,则必须确保self在计时器触发时目标(在本例中为)仍然有效。否则会发生崩溃。
self
(顺便说一句:内部performSelector使用NSTimer😀)
如果您对GCD计时器感兴趣,那么这是一个不错的起点: maicki / TimerWithGCD.md