ich dieses Problem mit folgenden Ansatz gelöst hatte:
Vier Textfeld mit 1. und 2. ein Read- nur. Im dritten Textfeld habe ich das Etikett mit zwei verschlüsselten Werten (d. H. XX) und das dritte Textfeld nur mit zwei Ziffern versehen. Das vierte Textfeld akzeptiert vier Ziffern.
Hinweis: Ich habe dieses Label und Textfeld-Ansatz verwendet, weil ich Kredit-/Debitkartennummer (14-stellig) bereits von der DB oder einer anderen Quelle haben. Ich muss nur die letzten 6 Ziffern vom Benutzer akzeptieren und mit dem vorhandenen Wert vergleichen.
Wenn der Benutzer zwei Ziffern im dritten Textfeld eingibt, springt er automatisch zum vierten Textfeld. Wenn der Benutzer dann im vierten Textfeld vier Ziffern eingibt, springt er automatisch in das Textfeld Verfallmonat, gefolgt von Ablaufjahr.
setBorderColor
Funktion legt nur die untere Rahmenfarbe auf Ablaufmonat und Jahr Textfeld fest.
Ich habe UIToolbar with done button
auf numerische Tastatur (während der Entwurfszeit festgelegt) für alle Textfeld hinzugefügt.

Im Folgenden finden Sie Code, den ich verwendet habe:
@IBOutlet weak var txtCardDetails1: UITextField!
@IBOutlet weak var txtCardDetails2: UITextField!
@IBOutlet weak var txtCardDetails3: UITextField!
@IBOutlet weak var txtCardDetails4: UITextField!
@IBOutlet weak var txtExpiryMonth: UITextField!
@IBOutlet weak var txtExpiryYear: UITextField!
let objBlackColor = UIColor.blackColor()
let objGreyColor = UIColor.grayColor()
Überschreibung func viewDidLoad() { Super.viewDidLoad()
//Add done button to numeric pad keyboard
let toolbarDone = UIToolbar.init()
toolbarDone.sizeToFit()
let barBtnDone = UIBarButtonItem.init(barButtonSystemItem: UIBarButtonSystemItem.Done,
target: self, action: #selector(VerifyCardViewController.doneButton_Clicked(_:)))
toolbarDone.items = [barBtnDone] // You can even add cancel button too
txtCardDetails3.inputAccessoryView = toolbarDone
txtCardDetails4.inputAccessoryView = toolbarDone
txtExpiryMonth.inputAccessoryView = toolbarDone
txtExpiryYear.inputAccessoryView = toolbarDone
// Set an action on EditingChanged event of textfield
txtCardDetails3.addTarget(self, action: #selector(VerifyCardViewController.textFieldDidChange(_:)), forControlEvents: UIControlEvents.EditingChanged)
txtCardDetails4.addTarget(self, action: #selector(VerifyCardViewController.textFieldDidChange(_:)), forControlEvents: UIControlEvents.EditingChanged)
txtExpiryMonth.addTarget(self, action: #selector(VerifyCardViewController.textFieldDidChange(_:)), forControlEvents: UIControlEvents.EditingChanged)
setBorderColor(txtExpiryMonth,setBorderColor: objGreyColor)
setBorderColor(txtExpiryYear,setBorderColor: objGreyColor)
}
//Set bottom border color to textfield
func setBorderColor(objTextField : UITextField, setBorderColor objColor:UIColor) {
let bottomLine = CALayer()
bottomLine.frame = CGRectMake(0.0, objTextField.frame.height - 1, objTextField.frame.width, 1.0)
bottomLine.backgroundColor = objColor.CGColor
objTextField.borderStyle = UITextBorderStyle.None
objTextField.layer.addSublayer(bottomLine)
}
func doneButton_Clicked(sender: AnyObject) { // Hide keyboard when done button is clicked
txtCardDetails3.resignFirstResponder()
txtCardDetails4.resignFirstResponder()
txtExpiryMonth.resignFirstResponder()
txtExpiryYear.resignFirstResponder()
}
func textFieldDidChange(textField: UITextField){ // Change text focus as per condition
let text = textField.text
if textField.tag == 101 { // Set tag to textfield (if multiple) during design time
if text?.utf16.count==2 {
txtCardDetails4.becomeFirstResponder() // Move to next text field
}
}
else if textField.tag == 102 {
if text?.utf16.count==4 {
txtExpiryMonth.becomeFirstResponder()
}
}
else if textField.tag == 103 {
if text?.utf16.count==2 {
txtExpiryYear.becomeFirstResponder()
}
}
}
func textFieldDidBeginEditing(textField: UITextField) {
if textField.tag == 103 { // Set border color based on focus
setBorderColor(txtExpiryMonth,setBorderColor: objBlackColor)
}
else if textField.tag == 104 {
setBorderColor(txtExpiryMonth,setBorderColor: objBlackColor)
}
textField.becomeFirstResponder()
}
func textFieldShouldReturn(textField: UITextField) -> Bool {
textField.resignFirstResponder()
return true;
}
//User can enter two digits in textfield with tag 101, 103, 104 and four digits in textfield with tag 102
func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
if let text = textField.text {
let newStr = (text as NSString)
.stringByReplacingCharactersInRange(range, withString: string)
if newStr.isEmpty {
return true
}
let intvalue = Int(newStr)
if textField.tag == 101 || textField.tag == 103 || textField.tag == 104{
return (intvalue >= 0 && intvalue <= 99) ? true : false
}
else if textField.tag == 102 {
return (intvalue >= 0 && intvalue <= 9999) ? true : false
}
}
return true
}
@Jayprakash Dubey, wenn es Ihr Problem löst, dann akzeptieren Sie bitte auch die Antwort. –
txt3.becomeFirstResponder() setzt den Fokus auf das dritte Textfeld und entfernt das 9. und 10. Zeichen. Ich möchte 9. und 10. Zeichen behalten und Benutzer erlauben, die nächsten 6 Buchstaben einzugeben. –
'self.view.endEditing (true); txt3.becomeFirstResponder()' Versuchen Sie Folgendes. Hoffe es wird dir helfen ... –