В самом простом случае все, что вам нужно, это создать подкласс Formatter
и переопределить 3 метода:
class MyFormatter: Formatter {
var maxLength = Int.max
override func string(for obj: Any?) -> String? {
return obj as? String
}
override func getObjectValue(_ obj: AutoreleasingUnsafeMutablePointer<AnyObject?>?, for string: String, errorDescription error: AutoreleasingUnsafeMutablePointer<NSString?>?) -> Bool {
obj?.pointee = string as NSString
return true
}
override func isPartialStringValid(_ partialString: String, newEditingString newString: AutoreleasingUnsafeMutablePointer<NSString?>?, errorDescription error: AutoreleasingUnsafeMutablePointer<NSString?>?) -> Bool {
return partialString.count <= maxLength
}
}
Затем установите форматер для вашего текстового поля:
let formatter = MyFormatter()
formatter.maxLength = 10
textField.formatter = formatter
Этого достаточнодля защиты от пользователей, набирающих более 10 символов или вставляющих строки длиной более 10 символов.Если вам нужны более продвинутые функции, такие как получение первых 10 символов при вставке в длинную строку, вы должны переопределить isPartialStringValid(_:proposedSelectedRange:originalString:originalSelectedRange:errorDescription:)
.