【问题标题】:Detect when user stopped / paused typing in Swift检测用户何时停止/暂停在 Swift 中输入
【发布时间】:2015-06-28 01:03:48
【问题描述】:

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

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

【问题讨论】:

    标签: ios swift uisearchbar uisearchbardelegate


    【解决方案1】:

    2016 年 9 月 1 日更新:

    我们可以使用NSTimers 或(从swift 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 时,目标 保留(在swift 中,目标始终是self)但是当您使用NSTimer 时,目标 保留。这意味着,如果您使用NSTimers,您必须确保目标(在本例中为self)在计时器触发时是活动的。否则会发生崩溃。

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

    如果您对 GCD 计时器感兴趣,请参考以下要点: maicki/TimerWithGCD.md

    【讨论】:

    • 很好的解决方案。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-27
    • 1970-01-01
    • 1970-01-01
    • 2015-09-22
    • 2023-04-05
    • 2011-10-27
    相关资源
    最近更新 更多