Я хочу добавить к ответу, данному @ sickp.
В его Swift
коде есть проблема, которая возникает с любым многобайтовым текстом (например, эмодзи). NSRange
и String
в Swift
несовместимы, поэтому досадно, что класс делегатов объединяет их. Хитрость заключается в простом преобразовании String
объектов в NSString
. Правильное решение, основанное на том, что написал @sickp, на самом деле таково:
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
let currentText = (textField.text as NSString?) ?? NSString()
let currentCharacterCount = currentText.length
if range.length + range.location > currentCharacterCount {
return false
}
let newLength = currentText.replacingCharacters(in: range, with: string).characters.count
return newLength <= 25
}