检测用户停止/暂停在Swift中input

我已经挖出了stackoverflow,并find了我转换为Swift的解决scheme,似乎并没有工作,select器仍在执行。

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或(自swift 2.0以来)NSObject的performSelector和朋友。

方法1:执行select器

 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)") } 

方法2: 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不容易访问或处理各种文本字段时,它可以使您的生活更轻松。

NSTimer方法与performSelector有何不同?

当你调用performSelector ,目标保留(在swift中目标始终是self ),但是当你使用NSTimer ,目标不会被保留。 这意味着,如果您使用NSTimer ,则必须确保在计时器触发时目标(在这种情况下为self )是活着的。 否则会发生崩溃。

(顺便说一下, performSelector内部使用NSTimer

如果你对GCD定时器感兴趣,可以从这里开始: maicki / TimerWithGCD.md