Я взял 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)
}
это работает !!
Пожалуйста, вы можете объяснить, Что text.startIndex.advancedBy (range.location) и start.advancedBy (range.length). Также результат, полученный выше, будет в методе shouldChangeCharactersInRange, правильно? –
После вычисления результата, будет ли встречный параметр, если метод, быть правильным для реализации? –
@sam right, все внутри 'shouldChangeCharactersInRange'. Да, используйте переменную 'result' в' if'-statement из OP. ('result.characters.count == 1 ...') – Astoria