2016-07-27 15 views
0

Я взял 3 текстовых поля и хочу, чтобы они удерживали только одно целое для цели OTP (это необходимость в проекте). Когда пользователь вводит номер в первом текстовом поле, ответчик должен автоматически назначаться во второе текстовое поле, а затем в третье текстовое поле. Как только пользователь вводит последнюю цифру OTP в третьем текстовом поле, я хочу попасть в веб-сервис. То, что я сделал до сих пор:Auto Resign и назначить первого ответчика в текстовом поле в Swift

class ActivationCodeVC: UIViewController, UITextFieldDelegate 

затем

otpField1.delegate = self 
otpField2.delegate = self 
otpField3.delegate = self 

затем

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

    let text=textField.text 
    let counter = text?.characters.count 
    if counter >= 1 { 

     if textField == otpField1{ 

      otpField2.becomeFirstResponder() 

     } else if textField == otpField2{ 

      otpField3.becomeFirstResponder() 

     } else if textField == otpField3{ 

      otpField3.resignFirstResponder() 

     } 

    } 

    return true 
} 

Курсор должен начать мигать на 2 TextField, когда пользователь вводит цифру в 1 TextField. Но это не так. После того, как я нажимаю вторую цифру, он вводит ее во второе текстовое поле, а затем снова курсор не перемещается в третий, но остается во втором текстовом поле. Во-вторых, когда я пытаюсь удалить цифру с помощью backspace, скажем, когда я пытаюсь удалить цифру 1-го текстового поля, она удаляет цифру со второго текстового поля.

Пожалуйста, помогите мне, какие методы я должен реализовать и как правильно выполнять функции.

Я пробовал это, но символ печатает во втором текстовом поле вместо первого и так далее.

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

    let text = textField.text 
    // create Range<Index> object from old-style one 
    let start = text!.startIndex.advancedBy(range.location) 
    let end = start.advancedBy(range.length) 
    let indexRange = start..<end 
    // calculate result string value 
    let result = text!.stringByReplacingCharactersInRange(indexRange, withString: string) 

//  let text=textField.text 
    let tempCount = result.characters.count 
    if tempCount == 1 { 

     if textField == otpField1{ 

      otpField2.becomeFirstResponder() 

     } else if textField == otpField2{ 

      otpField3.becomeFirstResponder() 

     } else if textField == otpField3{ 

      otpField3.resignFirstResponder() 

      let tempCode = otpField1.text! + otpField2.text! + otpField3.text! 

      if !APPDELEGATE.internetStatusFalse { 
       KVNProgress.showWithStatus("Loading...") 
       let soapApiObj: SoapApi = SoapApi() 
       mode = ControllerTypeMode.ACTIVAITONCODE 
       soapApiObj.resDelegate = self 
       soapApiObj.responseString = NSMutableString(string: "") 
       soapApiObj.callActivationCodeApi(tempCode) 
      } 
      else{ 
       let obj: SuccessFullPopVC=self.storyboard?.instantiateViewControllerWithIdentifier("successFullPopVC") as! SuccessFullPopVC 
       obj.titlelbl = LocalizationSystem.sharedLocalSystem().localizedStringForKey("Warning", value: nil) 
       obj.imgSuccess = UIImage(named: "warning") 
       obj.messagelbl = LocalizationSystem.sharedLocalSystem().localizedStringForKey("No internet connection.", value: nil) 
       self.navigationController?.presentViewController(obj, animated: false, completion: nil) 
      } 

     } 

    } 

    return true 
} 

Спасибо за окончательное решение:

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

    let text = textField.text 
    // create Range<Index> object from old-style one 
    let start = text!.startIndex.advancedBy(range.location) 
    let end = start.advancedBy(range.length) 
    let indexRange = start..<end 
    // calculate result string value 
    let result = text!.stringByReplacingCharactersInRange(indexRange, withString: string) 

    let newLength = result.characters.count 

    if textField == otpField1{ 
     if newLength == 1 { 
      otpField1.text = result 
      otpField2.becomeFirstResponder() 
      return false 
     } 

    } else if textField == otpField2{ 
     if newLength == 1 { 
      otpField2.text = result 
      otpField3.becomeFirstResponder() 
      return false 
     } 

    } else if textField == otpField3{ 
     if newLength == 1 { 
      otpField3.text = result 
      return false 

     } 

    } 

    return !(result.characters.count>1) 
} 

это работает !!

ответ

1

shouldChangeCharactersInRange -delegate метод получится вызванным до фактическое изменение текста (ввод символов/удаление в вашем случае).

Во-первых, вычислите строку, которую вы получите после ввода. Используйте аргументы метода делегата (range, string) и textField.text, как в фрагменте ниже.

let text = textField.text 
// create Range<Index> object from old-style one 
let start = text.startIndex.advancedBy(range.location) 
let end = start.advancedBy(range.length) 
let indexRange = start..<end 
// calculate result string value 
let result = text.stringByReplacingCharactersInRange(indexRange, withString: string) 
+0

Пожалуйста, вы можете объяснить, Что text.startIndex.advancedBy (range.location) и start.advancedBy (range.length). Также результат, полученный выше, будет в методе shouldChangeCharactersInRange, правильно? –

+0

После вычисления результата, будет ли встречный параметр, если метод, быть правильным для реализации? –

+0

@sam right, все внутри 'shouldChangeCharactersInRange'. Да, используйте переменную 'result' в' if'-statement из OP. ('result.characters.count == 1 ...') – Astoria

0

Обновление для Swift 3:

Используется ниже простого кода:

//To asssing next responder 
func textFieldShouldReturn(_ textField: UITextField) -> Bool { 
    if (textField == self.nameTextField) { 
     self.textField = self.emailTextField 
     self.emailTextField.becomeFirstResponder() 
    } else if (textField == self.emailTextField) { 
     self.textField = self.phoneNumberTextfield 
     self.phoneNumberTextfield.becomeFirstResponder() 
    } else if(textField == self.phoneNumberTextfield) { 
     self.textField = self.amountTextField 
     self.amountTextField.becomeFirstResponder() 
    } else if (textField == self.amountTextField) { 
     self.textField = self.descriptionTextField 
     self.descriptionTextField.becomeFirstResponder() 
    } else { 
     textField.resignFirstResponder() 
    } 
    return false 
}