Swift moderno
Observe que grande parte do código de exemplo online referente a esse problema está extremamente desatualizado .
Cole o seguinte em qualquer arquivo Swift em seu projeto. (Você pode nomear o arquivo com qualquer coisa, por exemplo, "Handy.swift".)
Isso finalmente corrige um dos problemas mais estúpidos do iOS:

Seus campos de texto agora têm um .maxLength.
É totalmente normal definir esse valor no storyboard durante o desenvolvimento ou defini-lo no código enquanto o aplicativo está em execução.
import UIKit
private var __maxLengths = [UITextField: Int]()
extension UITextField {
@IBInspectable var maxLength: Int {
get {
guard let l = __maxLengths[self] else {
return 150
}
return l
}
set {
__maxLengths[self] = newValue
addTarget(self, action: #selector(fix), for: .editingChanged)
}
}
func fix(textField: UITextField) {
let t = textField.text
textField.text = t?.prefix(maxLength)
}
}
É simples assim.
Nota de rodapé - hoje em dia, para truncar com segurança um Stringcom rapidez, você simplesmente.prefix(n)
Uma versão única ainda mais simples ...
O procedimento acima corrige todos os campos de texto em seu projeto.
Se você deseja apenas que um determinado campo de texto seja simplesmente limitado a dizer "4", e pronto ...
class PinCodeEntry: UITextField {
override func didMoveToSuperview() {
super.didMoveToSuperview()
addTarget(self, action: #selector(fixMe), for: .editingChanged)
}
@objc private func fixMe() { text = text?.prefix(4) }
}
Ufa! Isso é tudo que há para fazer.
(A propósito, aqui está uma dica semelhante muito útil relacionada ao UIText View ,
https://stackoverflow.com/a/42333832/294884 )
Para o programador OCD (como eu) ...
Como @LeoDabus lembra, .prefixretorna uma substring. Se você é extremamente atencioso, este
let t = textField.text
textField.text = t?.prefix(maxLength)
seria
if let t: String = textField.text {
textField.text = String(t.prefix(maxLength))
}
Apreciar!