2017-02-27 12 views
1

私は自分のプロジェクトでオートコンプリートに取り組んでいます。それからtextfieldDidChangeの値を検出して、それ以降のメソッド(APIへのリンク)を呼び出したいと思います。テキストフィールドdidChange with timer

十分明確であることを願っています。 ありがとうございました!スウィフト3では

答えて

2

まず、あなたのクラスのTextFieldのデリゲートを作成することを確認してくださいこれは:

var timer = Timer() 
var count = 0 

func textFieldDidChange(textField: UITextField){ 
    timer.invalidate() 
    timer = Timer.scheduledTimer(timeInterval: 0.1, target: self, selector: #selector(self.timerFunc), userInfo: nil, repeats: true) 
} 

func timerFunc(){ 
    count += 1 
    if count == 5{ 
     timer.invalidate() 
     // do your things here down here, I assumed that your method is called autocomplete 
     autocomplete() 
    } 
} 

それが助けてくれることを願っています!

4

、あなたはおそらく、「値が変更され」ない「の編集を変更」に接続し、タイマーをリセットし、別のタイマーを開始します:

weak var timer: Timer? 

@IBAction func didChangeEditing(_ sender: UITextField) { 
    timer?.invalidate() 
    timer = .scheduledTimer(withTimeInterval: 0.5, repeats: false) { [weak self] timer in 
     // trigger your autocomplete 
    } 
} 

それとも、代わりshouldChangeCharactersInにフックすることができます。たとえば:あなたは同じように、タイマーを使用することができ、その後

textField.delegate = self 
numbersTextField.addTarget(self, action: #selector(self.textFieldDidChange), for: .editingChanged) 

viewDidLoad()で、その後

class yourClass: UIViewController, UITextFieldDelegate{ 
    //... 
} 

そして:

class ViewController: UIViewController, UITextFieldDelegate { 

    @IBOutlet weak var textField: UITextField! 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     textField.delegate = self  // or you can do this in IB 
    } 

    weak var timer: Timer? 

    func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { 
     timer?.invalidate()   // cancel prior timer, if any 

     timer = .scheduledTimer(withTimeInterval: 0.5, repeats: false) { [weak self] timer in 
      // trigger your autocomplete 
     } 

     return true 
    } 
} 
+0

多くのありがとう!!!! –