Tua*_* Vu 9 uisearchbar uisearchbardelegate ios swift
我已经挖掘了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)
}
Run Code Online (Sandbox Code Playgroud)
在swift中有更好的方法吗?谢谢!
nac*_*o4d 43
更新2016/09/01:
我们可以使用NSTimers或(自swift 2.0)NSObject performSelector和朋友.
performSelectorfunc 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)")
}
Run Code Online (Sandbox Code Playgroud)
NSTimervar 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"])")
}
Run Code Online (Sandbox Code Playgroud)
注意我正在传递textField延迟函数.它并不总是必需的,但是当textField它不容易访问或处理各种文本字段时,它可以使您的生活更轻松.
NSTimer方法是从不同performSelector?当你调用performSelector目标时,保留目标(在swift中,目标始终是self),但是当你使用NSTimer目标时不保留.这意味着,如果你使用NSTimers,你必须确保self在计时器触发时目标(在这种情况下)是活着的.否则会发生崩溃.
(BTW:内部performSelector使用NSTimer)
如果你对GCD计时器感兴趣,那么这个要点就是一个好的开始: maicki/TimerWithGCD.md
| 归档时间: |
|
| 查看次数: |
5208 次 |
| 最近记录: |