Ich stieß heute auf das gleiche Problem und war erstaunt, dass es keine Möglichkeit gibt, diese Änderung von einer Benachrichtigungs- oder Delegate-Methode zu erkennen, da ich denke, dass dies ein ziemlich häufiges Bedürfnis ist. Ich baue einen Multi-Feld-Text-Box-Eingang für die Erfassung eines PIN-Codes. Ich fahre automatisch nach Eingabe eines Wertes auf die nächsten/vorherigen Felder und möchte nicht, dass die Tastatur jedes Mal, wenn ich zwischen Feldern umschalte, auf die Standardeinstellungen zurückwechselt. Ich kam mit dieser Lösung (Hinweis: Dies löst es nicht perfekt, weil es erfordert, dass der Benutzer etwas eingibt, aber löst es für ähnliche Bedürfnisse dieser Pin-Ansicht).
Ich habe eine benutzerdefinierte Ansicht genannt MyPinView, wobei diese Ansicht hat var
var keyBoardType = UIKeyboardType.alphabet
und eine Reihe von UITextFields
var pinFields = [UITextField]()
, die wie so angelegt wird. 
Für eine vereinfachte Version, ich werde nicht alle durch die Details der Umgang mit Rand Fällen gehen die shouldChangeCharactersInRange
erfordern umgesetzt werden und wird mit meinem Event-Handler-Implementierung bleiben.
Im Grunde müssen Sie sehen, welcher Text eingegeben wurde und bestimmen, welche Tastatur beim Vorrücken von Feldern angezeigt wird (meins unterstützt nur Zahlen und Buchstaben, die mit der abc/123-Taste umgeschaltet werden, damit ich Emoji und andere Typen ignorieren kann).
// MARK: UITextField Event
func textFieldDidChange(textField: UITextField) {
// If the user typed one character, move to the next cell.
if (textField.text?.count == 1) {
let index = pinFields.index(of: textField)
textField.resignFirstResponder()
if (pinFields.count > index! + 1) {
let pinField = pinFields[index! + 1]
self.updateKeyboardTypeForString(input: textField.text)
pinField.keyboardType = self.keyBoardType
pinField.becomeFirstResponder()
}
} // If they deleted the character move to previous cell
else if (textField.text?.count == 0) {
let index = pinFields.index(of: textField)
if (index! - 1 >= 0) {
let pinField = pinFields[index! - 1]
self.updateKeyboardTypeForString(input: pinField.text)
pinField.keyboardType = self.keyBoardType
pinField.becomeFirstResponder()
}
}
}
// MARK: - Keyboard Type Helper
func updateKeyboardTypeForString(input:String?) {
let letters = NSCharacterSet.letters
let digits = NSCharacterSet.decimalDigits
let pinText = input == nil ? "" : input
for uniScalar in pinText!.unicodeScalars {
if letters.contains(uniScalar) {
self.keyBoardType = UIKeyboardType.alphabet
} else if digits.contains(uniScalar) {
self.keyBoardType = UIKeyboardType.numbersAndPunctuation
}
}
}
Damit können Sie verfolgen, wo die Tastatur zuletzt aufgehört hat. Wenn Ihre Textfelder mehr als ein Zeichen zulassen, müssen Sie offensichtlich nur das letzte Zeichenzeichen übernehmen und an updateKeyboardTypeForString
übergeben. Der Hauptfall, in dem dies nicht hilft, ist das Beibehalten des Tastaturstatus zwischen Eingabefeldern, in denen der Benutzer die Tastatur umgeschaltet hat, aber nichts eingegeben hat. Insgesamt hilft dies jedoch, diese Art von Szenario besser nutzbar zu machen.
Hoffe das hilft, fröhliche Programmierung.
während ich immer noch viel Wert darin sehe, was du sagst .. es wäre noch klarer, wenn du uns einen Beispielcode zeigen oder uns auf eine Dokumentation verweisen könntest. – abbood
Hier ist der Link, wo Sie für dimonds wenig graben können https://developer.apple.com/library/ios/documentation/uikit/reference/UITextInputTraits_Protocol/Reference/UITextInputTraits.html – Retro