2017-02-27 56 views
1

我正在處理我的項目中的自動完成,我想在textfieldDidChange值和調用方法(鏈接到API)500MS之後檢測。Textfield didChange with timer

我希望它很清楚 感謝您的幫助!

回答

2

首先確保讓你的類TextField的委託:

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

然後在viewDidLoad()

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

之後,你可以用一個定時器,像這個:

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

在斯威夫特3,你可能要連接到「編輯而改變」,不是「價值化」,並復位定時器並開始另一個定時器:

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。例如:

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

非常感謝!!!! –