В Swift 5 и iOS 12 попробуйте следующую реализацию textField(_:shouldChangeCharactersIn:replacementString:)
метода, являющегося частью UITextFieldDelegate
протокола:
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
guard let textFieldText = textField.text,
let rangeOfTextToReplace = Range(range, in: textFieldText) else {
return false
}
let substringToReplace = textFieldText[rangeOfTextToReplace]
let count = textFieldText.count - substringToReplace.count + string.count
return count <= 10
}
- Самая важная часть этого кода - преобразование из
range
( NSRange
) в rangeOfTextToReplace
( Range<String.Index>
). Посмотрите этот видеоурок, чтобы понять, почему это преобразование важно.
- Для того, чтобы этот код работает правильно, вы должны также установить
textField
«S smartInsertDeleteType
значение UITextSmartInsertDeleteType.no
. Это предотвратит возможную вставку (нежелательного) лишнего пробела при выполнении операции вставки.
Полный пример кода ниже показывает, как реализовать textField(_:shouldChangeCharactersIn:replacementString:)
в UIViewController
:
import UIKit
class ViewController: UIViewController, UITextFieldDelegate {
@IBOutlet var textField: UITextField! // Link this to a UITextField in Storyboard
override func viewDidLoad() {
super.viewDidLoad()
textField.smartInsertDeleteType = UITextSmartInsertDeleteType.no
textField.delegate = self
}
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
guard let textFieldText = textField.text,
let rangeOfTextToReplace = Range(range, in: textFieldText) else {
return false
}
let substringToReplace = textFieldText[rangeOfTextToReplace]
let count = textFieldText.count - substringToReplace.count + string.count
return count <= 10
}
}
text.characters.count
использование не рекомендуетсяtext.count
Я так делаю:
Код у меня работает. Но я работаю с раскадровкой. В Storyboard я добавляю действие для текстового поля в контроллере представления при изменении редактирования .
источник
Обновление для Swift 4
источник
Добавить подробности из ответа @Martin
источник
В Swift 4
Ограничение на 10 символов для текстового поля и разрешение на удаление (backspace)
источник
небольшое изменение для iOS 9
источник
Swift 3
источник
вы можете расширить UITextField и добавить
@IBInspectable
объект для его обработки:SWIFT 5
и после этого определите его в инспекторе атрибутов
См. Оригинальный ответ Swift 4
источник
Если вы хотите перезаписать последнюю букву:
источник
Я опубликовал решение using
IBInspectable
, поэтому вы можете изменить значение максимальной длины как в построителе интерфейса, так и программно. Посмотрите здесьисточник
Вы можете использовать Swift 5 или Swift 4, как изображение ниже
добавить код в представление ViewController
Вы можете скачать полный исходный код с GitHub: https://github.com/enamul95/TextFieldMaxLen
источник
Остерегайтесь ошибки отмены для UITextField, упомянутой в этом сообщении: установите максимальную длину символа UITextField
вот как быстро это исправить
источник
источник
Я использовал этот протокол / расширение в одном из своих приложений, и он стал немного более читаемым. Мне нравится, как он распознает пробелы и явно сообщает вам, когда символ является пробелом.
Что следует учитывать:
1. Независимо от того, что реализует это расширение протокола, необходимо указать ограничение на количество символов. Обычно это будет ваш ViewController, но вы можете реализовать ограничение на количество символов как вычисляемое свойство и вернуть что-то еще, например ограничение на количество символов для одной из ваших моделей.
2. Вам нужно будет вызвать этот метод внутри метода делегата shouldChangeCharactersInRange текстового поля. В противном случае вы не сможете заблокировать ввод текста, вернув false и т. Д.
3. Возможно, вы захотите пропустить символы возврата. Вот почему я добавил дополнительную функцию для обнаружения пробелов. Ваш метод shouldChangeCharacters может проверить это и на раннем этапе вернуть true, поэтому вы всегда разрешаете возврат.
Если кому-то из вас интересно, у меня есть репозиторий Github, где я взял некоторые из этих ограничений на количество символов и поместил их в платформу iOS. Существует протокол, который вы можете реализовать, чтобы получить отображение предельного количества символов в стиле Twitter, которое показывает, насколько вы далеко превысили лимит символов.
CharacterLimited Framework на Github
источник
Поскольку делегаты являются отношениями один-к-одному, и я мог бы использовать его в другом месте по другим причинам, мне нравится ограничивать длину текстового поля, добавляя этот код в их настройку:
источник
Я использую это;
Ограничить 3 символа
источник
Swift 5
источник
Вам нужно проверить, больше ли существующая строка плюс ввод больше 10.
источник