2016-02-11 4 views
4
func textFieldDidBeginEditing(textField: UITextField) { 
    scrlView.setContentOffset(CGPointMake(0, textField.frame.origin.y-70), animated: true) 


    if(textField == firstDigit){ 

     textField.becomeFirstResponder() 
     secondDigit.resignFirstResponder() 
    } 


    else if(textField == secondDigit){ 

     textField.becomeFirstResponder() 
     thirdDigit.resignFirstResponder() 
    } 

    else if(textField == thirdDigit){ 
     //textField.becomeFirstResponder() 
     fourthDigit.becomeFirstResponder() 
    } 

Я использую четыре текстовых поля для ввода OTP, в которые можно ввести только один номер за раз. После ввода номера мне нужно переместить курсор автоматически в следующее текстовое поле.Как перемещать курсор из одного текстового поля в другое автоматически в swift ios программно?

ответ

12

Набор TextField делегат и добавить цель:

override func viewDidLoad() { 
     super.viewDidLoad() 

     first.delegate = self 
     second.delegate = self 
     third.delegate = self 
     fourth.delegate = self 


     first.addTarget(self, action: "textFieldDidChange:", forControlEvents: UIControlEvents.EditingChanged) 
     second.addTarget(self, action: "textFieldDidChange:", forControlEvents: UIControlEvents.EditingChanged) 
     third.addTarget(self, action: "textFieldDidChange:", forControlEvents: UIControlEvents.EditingChanged) 
     fourth.addTarget(self, action: "textFieldDidChange:", forControlEvents: UIControlEvents.EditingChanged) 
    } 

Теперь при изменении текста изменений TextField

И, наконец, когда пользователь начать редактирование ясный TextField

extension ViewController: UITextFieldDelegate{ 
    func textFieldDidBeginEditing(textField: UITextField) { 
     textField.text = "" 
    } 
} 
+0

Спасибо. Он отлично работал @HamzaAnsari –

0

** звонить из UITextfieldDelegate и сделать следующее текстовое поле первым ответчиком и не нужно добавлять таргетинг Ю и не забудьте установить делегат всех текстовых полей в viewDidLoad **

  extension ViewController : UITextFieldDelegate { 


      func textFieldShouldReturn(textField: UITextField) -> Bool { 

       nextTextFieldToFirstResponder(textField) 

       return true; 
      } 




      func nextTextFieldToFirstResponder(textField: UITextField) { 

      if textField == emailTextField 
      { 
       self.firstNameTextField.becomeFirstResponder() 
      } 
      else if textField == firstNameTextField { 

       self.lastNameTextField.becomeFirstResponder() 
      } 

      else if textField == lastNameTextField { 

       self.passwordTextField.becomeFirstResponder() 
      } 

      else if textField == passwordTextField { 

       self.confirmPassTextField.becomeFirstResponder() 
      } 

      else if textField == confirmPassTextField { 
       self.confirmPassTextField.resignFirstResponder() 

      } 

      } 
0

Я пробовал много кодов и, наконец, это работает для меня в Swift 3.0 Последнее [март 2017]

The «ViewController» класс должен унаследовать «UITextFieldDelegate» для создания этого кода.

class ViewController: UIViewController,UITextFieldDelegate 

Добавьте текстовое поле с Надлежащей Tag Nuber и этот номер используется тег, чтобы взять контроль в соответствующее текстовом поле на основе дополнительного числа тегов, возложенное на него.

override func viewDidLoad() { 

userNameTextField.delegate = self 

     userNameTextField.tag = 0 

     userNameTextField.returnKeyType = UIReturnKeyType.next 

     passwordTextField.delegate = self 

     passwordTextField.tag = 1 


     passwordTextField.returnKeyType = UIReturnKeyType.go 

} 

В приведенном выше коде, «returnKeyType = UIReturnKeyType.next», где будет сделать ключ ключ возврата подушечка для отображения в качестве «Next» вы также есть и другие варианты, как «Регистрация/Go» и т.д., на основе вашего приложение изменит значения.

Это «textFieldShouldReturn» представляет собой метод UITextFieldDelegate под контролем и здесь мы имеем следующий выбор полей на основе значения Tag приращением

func textFieldShouldReturn(_ textField: UITextField) -> Bool 

    { 

     if let nextField = textField.superview?.viewWithTag(textField.tag + 1) as? UITextField { 

      nextField.becomeFirstResponder() 

     } else { 

      textField.resignFirstResponder() 

      return true; 

     } 

     return false 

    } 
1

Во-первых, мы должны установить метку для UITextField;

func textFieldShouldReturnSingle(_ textField: UITextField , newString : String) 
{ 
    let nextTag: Int = textField.tag + 1 

    let nextResponder: UIResponder? = textField.superview?.superview?.viewWithTag(nextTag) 
    textField.text = newString 
    if let nextR = nextResponder 
    { 
     // Found next responder, so set it. 
     nextR.becomeFirstResponder() 
    } 
    else 
    { 
     // Not found, so remove keyboard. 
     textField.resignFirstResponder() 
    } 
} 

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { 

    let newString = ((textField.text)! as NSString).replacingCharacters(in: range, with: string) 

    let newLength = newString.characters.count 

    if newLength == 1 { 
     textFieldShouldReturnSingle(textField , newString : newString) 
     return false 
    } 

    return true 
} 

Примечание: UITextField принимает только один символ в формате чисел, который находится в формате OTP.

+0

хорошая попытка, ценить –

0

для быстрого 3

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { 
    // On inputing value to textfield 
    if ((textField.text?.characters.count)! < 1 && string.characters.count > 0){ 
     let nextTag = textField.tag + 1; 

     // get next responder 
     let nextResponder = textField.superview?.viewWithTag(nextTag); 
     textField.text = string; 

     if (nextResponder == nil){ 
      textField.resignFirstResponder() 
     } 
     nextResponder?.becomeFirstResponder(); 
     return false; 
    } 
    else if ((textField.text?.characters.count)! >= 1 && string.characters.count == 0){ 
     // on deleting value from Textfield 
     let previousTag = textField.tag - 1; 

     // get next responder 
     var previousResponder = textField.superview?.viewWithTag(previousTag); 

     if (previousResponder == nil){ 
      previousResponder = textField.superview?.viewWithTag(1); 
     } 
     textField.text = ""; 
     previousResponder?.becomeFirstResponder(); 
     return false; 
    } 
    return true; 
} 
0

Решения Для Swift 4

В этом решении, Вы отправитесь к следующему полю. И когда вы нажмите «Стереть», вы попадете в предыдущее текстовое поле.

Шаг 1: Set Selector для текстовых полей

override func viewDidLoad() { 
     super.viewDidLoad() 

     otpTextField1.addTarget(self, action: #selector(self.textFieldDidChange(textField:)), for: UIControlEvents.editingChanged) 
     otpTextField2.addTarget(self, action: #selector(self.textFieldDidChange(textField:)), for: UIControlEvents.editingChanged) 
     otpTextField3.addTarget(self, action: #selector(self.textFieldDidChange(textField:)), for: UIControlEvents.editingChanged) 
     otpTextField4.addTarget(self, action: #selector(self.textFieldDidChange(textField:)), for: UIControlEvents.editingChanged) 

    } 

Шаг 2: Теперь мы будем обрабатывать двигаться в следующем текстовом поле и Erase текстового поля.

@objc func textFieldDidChange(textField: UITextField){ 
     let text = textField.text 
     if text?.count == 1 { 
      switch textField{ 
      case otpTextField1: 
       otpTextField2.becomeFirstResponder() 
      case otpTextField2: 
       otpTextField3.becomeFirstResponder() 
      case otpTextField3: 
       otpTextField4.becomeFirstResponder() 
      case otpTextField4: 
       otpTextField4.resignFirstResponder() 
      default: 
       break 
      } 
     } 
     if text?.count == 0 { 
      switch textField{ 
      case otpTextField1: 
       otpTextField1.becomeFirstResponder() 
      case otpTextField2: 
       otpTextField1.becomeFirstResponder() 
      case otpTextField3: 
       otpTextField2.becomeFirstResponder() 
      case otpTextField4: 
       otpTextField3.becomeFirstResponder() 
      default: 
       break 
      } 
     } 
     else{ 

     } 
    } 

Важное примечание: Не забудьте установить делегата.

Смежные вопросы