一尘不染

检测用户何时停止/暂停在Swift中键入

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

有没有更好的方法可以迅速做到这一点?谢谢!


阅读 242

收藏
2020-07-07

共1个答案

一尘不染

更新2016/09/01:

我们可以使用NSTimers或(自2.0版本以来)的NSObject performSelector和朋友。

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

如何NSTimer方法是从不同performSelector

调用performSelector目标时, 保留目标(快速移动时始终是目标self),但使用NSTimer目标时,
则不会
保留目标。这意味着,如果使用NSTimers,则必须确保self在计时器触发时目标(在本例中为)仍然有效。否则会发生崩溃。

(顺便说一句:内部performSelector使用NSTimer😀)

如果您对GCD计时器感兴趣,那么这是一个不错的起点: maicki /
TimerWithGCD.md

2020-07-07