Con Swift 5 e iOS 12, intente la siguiente implementación del textField(_:shouldChangeCharactersIn:replacementString:)
método que forma parte del UITextFieldDelegate
protocolo:
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
}
- La parte más importante de este código es la conversión de
range
( NSRange
) a rangeOfTextToReplace
( Range<String.Index>
). Vea este video tutorial para comprender por qué esta conversión es importante.
- Para que esto funcione correctamente el código, también se debe establecer el
textField
's smartInsertDeleteType
valor a UITextSmartInsertDeleteType.no
. Esto evitará la posible inserción de un espacio adicional (no deseado) al realizar una operación de pegado.
El código de ejemplo completo a continuación muestra cómo implementar textField(_:shouldChangeCharactersIn:replacementString:)
en un 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
es un uso obsoletotext.count
Lo hago así:
El código me funciona. Pero yo trabajo con storyboard. En Storyboard agrego una acción para el campo de texto en el controlador de vista al editar la modificación .
fuente
Actualización para Swift 4
fuente
Agregar más detalles de la respuesta de @Martin
fuente
En Swift 4
Límite de 10 caracteres para el campo de texto y permite eliminar (retroceso)
fuente
un pequeño cambio para iOS 9
fuente
Swift 3
fuente
puede extender UITextField y agregar un
@IBInspectable
objeto para manejarlo:SWIFT 5
y luego definirlo en el inspector de atributos
Ver la respuesta original de Swift 4
fuente
Si desea sobrescribir la última letra:
fuente
Publiqué una solución usando
IBInspectable
, para que pueda cambiar el valor de longitud máxima tanto en el generador de interfaces como mediante programación. Compruébalo aquífuente
Puede usar en swift 5 o swift 4, como la imagen que se ve abajo
agregar el código a la vista ViewController
Puede descargar el formulario de fuente completa GitHub: https://github.com/enamul95/TextFieldMaxLen
fuente
Tenga cuidado con el error de deshacer para UITextField mencionado en esta publicación: establezca la longitud máxima de caracteres de un UITextField
así es como lo arreglas rápidamente
fuente
fuente
He estado usando este protocolo / extensión en una de mis aplicaciones, y es un poco más legible. Me gusta cómo reconoce los espacios de retroceso y te dice explícitamente cuándo un personaje es un espacio de retroceso.
Algunas cosas a considerar:
1. Lo que implemente esta extensión de protocolo debe especificar un límite de caracteres. Por lo general, ese será su ViewController, pero podría implementar el límite de caracteres como una propiedad calculada y devolver algo más, por ejemplo, un límite de caracteres en uno de sus modelos.
2. Deberá llamar a este método dentro del método de delegado shouldChangeCharactersInRange de su campo de texto. De lo contrario, no podrá bloquear la entrada de texto devolviendo falso, etc.
3. Probablemente desee permitir el paso de los caracteres de retroceso. Es por eso que agregué la función adicional para detectar espacios de retroceso. Su método shouldChangeCharacters puede verificar esto y devolver "verdadero" desde el principio para que siempre permita espacios atrás.
Si alguno de ustedes está interesado, tengo un repositorio de Github donde tomé parte de este comportamiento de límite de caracteres y lo puse en un marco de iOS. Hay un protocolo que puede implementar para obtener una pantalla de límite de caracteres similar a Twitter que le muestra qué tan lejos ha superado el límite de caracteres.
Marco de CharacterLimited en Github
fuente
Dado que los delegados tienen una relación de 1 a 1 y podría querer usarlo en otro lugar por otros motivos, me gusta restringir la longitud del campo de texto agregando este código dentro de su configuración:
fuente
Estoy usando esto;
Límite 3 char
fuente
Swift 5
fuente
Debe verificar si la cadena existente más la entrada es mayor que 10.
fuente