检测用户停止/暂停在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