自动在Swift中的文本字段中分配和分配第一个响应者

我已经采取了3个文本字段,并希望他们只持有一个整数OTP的目的(这是项目devise的需要)。 当用户在第一个文本字段中input数字时,应答者应自动分配到第二个文本字段,然后到第三个文本字段。 一旦用户在第三个文本框中input了最后一个OTP数字,我想要打开web服务。 我到目前为止所做的是:

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 } 

当用户在第一个文本框中input数字时,光标应该在第二个文本框上闪烁。 但事实并非如此。 在按下第二个数字之后,将其input到第二个文本字段,然后光标不会移动到第三个字符,但会保留在第二个文本字段中。 其次,当我试图通过退格去除数字时,比方说,当我尝试删除第一个文本字段数字时,它从第二个文本字段中删除数字。

请帮助我应该实施什么方法,以及如何正确实现function。

我试过这个,但字符是在第二个文本字段而不是第一个打印等等。

 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 } 

感谢您的最终解决scheme:

 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) } 

有用!!

shouldChangeCharactersInRange -delegate方法在实际文本更改之前调用(在您的情况下为字符放置/删除)。

首先,计算input操作后获得的string。 使用委托方法参数( rangestring )和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) 

更新了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 }