私は3つのテキストフィールドを取得し、OTPの目的で1つの整数のみを保持するようにしました(これはプロジェクト設計の必要性です)。ユーザーが最初のテキストフィールドに番号を入力すると、レスポンダーは自動的に2番目のテキストフィールドに割り当てられ、次に3番目のテキストフィールドに割り当てられます。ユーザーが3番目のテキストフィールドに最後の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
}
ユーザーが1番目のテキストフィールドに数字を入力すると、2番目のテキストフィールドでカーソルが点滅し始めます。しかし、そうではありません。2桁目を押すと、2桁目に入力され、カーソルは3桁目に移動せず、2桁目に留まります。次に、バックスペースで数字を削除しようとすると、たとえば、最初のテキストフィールドの数字を削除しようとすると、2番目のテキストフィールドから数字が削除されます。
実装する必要のある方法と、機能を正しく実現する方法を教えてください。
これを試しましたが、文字が最初のテキストフィールドではなく2番目のテキストフィールドに印刷されています。
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)
}
できます!!
shouldChangeCharactersInRange
-delegateメソッドが呼び出されます前に、実際のテキストの変更(文字PUT /削除お使いの場合)。
まず、入力アクションの後に取得する文字列を計算します。以下のスニペットのように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)
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加