¿Cómo puedo configurar la cantidad máxima de caracteres en a UITextField
en el iPhone SDK cuando cargo a UIView
?
ios
objective-c
cocoa-touch
uitextfield
Domness
fuente
fuente
Respuestas:
Si bien la
UITextField
clase no tiene una propiedad de longitud máxima, es relativamente simple obtener esta funcionalidad configurando los campos de textodelegate
e implementando el siguiente método de delegado:C objetivo
Rápido
Antes de que cambie el campo de texto, el UITextField le pregunta al delegado si se debe cambiar el texto especificado . El campo de texto no ha cambiado en este punto, por lo que tomamos su longitud actual y la longitud de la cadena que estamos insertando (ya sea pegando texto copiado o escribiendo un solo carácter con el teclado), menos la longitud del rango. Si este valor es demasiado largo (más de 25 caracteres en este ejemplo), regrese
NO
para prohibir el cambio.Al escribir un solo carácter al final de un campo de texto,
range.location
será la longitud del campo actual yrange.length
será 0 porque no estamos reemplazando / eliminando nada. Insertar en el medio de un campo de texto solo significa un carácter diferenterange.location
, y pegar varios caracteres solo significa questring
tiene más de un carácter.La eliminación de caracteres individuales o el corte de varios caracteres se especifica mediante a
range
con una longitud distinta de cero y una cadena vacía. El reemplazo es solo una eliminación de rango con una cadena no vacía.Una nota sobre el fallo "deshacer"
Como se menciona en los comentarios, hay un error
UITextField
que puede provocar un bloqueo.Si pega en el campo, pero su implementación de validación previene el pegado, la operación de pegar aún se registra en el búfer de deshacer de la aplicación. Si luego dispara un deshacer (sacudiendo el dispositivo y confirmando un Deshacer),
UITextField
intentará reemplazar la cadena que cree que se pegó en sí misma con una cadena vacía. Esto se bloqueará porque nunca realmente pegar la cadena en sí misma. Intentará reemplazar una parte de la cadena que no existe.Afortunadamente puedes protegerlo
UITextField
de suicidarse así. Sólo tiene que asegurarse de que el rango se propone sustituir hace existir dentro de su cadena actual. Esto es lo que hace la comprobación de cordura inicial anterior.Swift 3.0 con copiar y pegar funcionando bien.
Espero que te sea útil.
fuente
return newLength <= 25;
UITextField
iPad iOS 8.1. (+1 para comentar). ¿El autor agregaría algo sobre esto, ya que es la respuesta mejor calificada? Estoy feliz de hacer una edición, ¡pero la mía parece ser rechazada regularmente! :-)Swift 4
Editar: problema de pérdida de memoria solucionado.
fuente
Gracias agosto! ( Publicar )
Este es el código con el que terminé que funciona:
fuente
return textField.text.length < MAX_LENGTH || range.length != 0;
Para completar la respuesta de agosto , una posible implementación de la función propuesta (ver delegado de UITextField ).
No probé el código domness , pero el mío no se atasca si el usuario alcanzó el límite, y es compatible con una nueva cadena que viene a reemplazar una más pequeña o igual.
fuente
No puede hacer esto directamente:
UITextField
no tiene el atributo maxLength , pero puede configurar elUITextField's
delegado y luego usar:fuente
A menudo tiene múltiples campos de entrada con una longitud diferente.
fuente
La mejor manera sería configurar una notificación sobre el cambio de texto. En su
-awakeFromNib
método de controlador de vista, querrá:Luego, en la misma clase, agregue:
Luego, conecte la salida
myTextField
a suUITextField
y no le permitirá agregar más caracteres después de alcanzar el límite. Asegúrese de agregar esto a su método dealloc:fuente
He creado esta subclase UITextFieldLimit:
Tome el
UITextFieldLimit.h
yUITextFieldLimit.m
de este repositorio de GitHub:https://github.com/JonathanGurebo/UITextFieldLimit
y comienza a probar!
Marque su UITextField creado por el guión gráfico y vincúlelo a mi subclase utilizando el Inspector de identidad:
Luego puede vincularlo a un IBOutlet y establecer el límite (el valor predeterminado es 10).
Su archivo ViewController.h debe contener: (si no desea modificar la configuración, como el límite)
Su archivo ViewController.m debería
@synthesize textFieldLimit
.Establezca el límite de longitud de texto en su archivo ViewController.m:
Espero que la clase te ayude. ¡Buena suerte!
fuente
Esto debería ser suficiente para resolver el problema (reemplace 4 por el límite que desea). Solo asegúrese de agregar delegado en IB.
fuente
Use la extensión a continuación para establecer la longitud máxima de caracteres de a
UITextField
yUITextView
.Swift 4.0
UITextView
Puede establecer el límite a continuación.
fuente
Simulo el reemplazo de cadena real que está por suceder para calcular la longitud de esa cadena futura:
fuente
Versión Swift 3 // ***** ¡Esto NO funcionará con Swift 2.x! ***** //
Primero cree un nuevo archivo Swift: TextFieldMaxLength.swift, y luego agregue el siguiente código:
y luego verá en Storyboard un nuevo campo (Longitud máxima) cuando seleccione cualquier TextField
Si aún tiene más preguntas, consulte este enlace: http://www.globalnerdy.com/2016/05/18/ios-programming-trick-how-to-use-xcode-to-set-a-text-fields -maximum-length-visual-studio-style /
fuente
Con el creador de interfaces, puede vincular y obtener el evento "Edición modificada" en cualquiera de sus funciones. Ahora puedes poner cheque por la longitud
fuente
El siguiente código es similar a la respuesta de sickp pero maneja correctamente las operaciones de copiar y pegar. Si intenta pegar un texto que es más largo que el límite, el siguiente código truncará el texto para que se ajuste al límite en lugar de rechazar la operación de pegar por completo.
fuente
Hay una solución genérica para configurar la longitud máxima en Swift. Mediante IBInspectable, puede agregar un nuevo atributo en Xcode Attribute Inspector.
fuente
Para que funcione con cortar y pegar cadenas de cualquier longitud, sugeriría cambiar la función a algo como:
fuente
Swift 4
fuente
guard
?Swift 2.0 +
En primer lugar, cree una clase para este proceso. Vamos a llamarlo StringValidator.swift.
Luego solo pegue el siguiente código dentro de él.
Ahora guarda la clase .....
Uso..
Ahora vaya a su clase viewController.swift y haga las salidas de su campo de texto como ...
Ahora vaya al método shouldChangeCharactersInRange del campo de texto y úselo de la siguiente manera.
No olvide establecer el protocolo delegado / métodos de campos de texto.
Permítanme explicar acerca de esto ... Estoy usando el proceso de extensión simple de cadena que escribí dentro de otra clase. Ahora solo estoy llamando a esos métodos de extensión desde otra clase donde los necesito agregando verificación y valor máximo.
Caracteristicas...
Tipos ...
usesOnlyCharactersIn // Acepta solo caracteres.
usesCharactersIn // Acepta la combinación de caracteres
doesNotContainsCharactersIn // No aceptará caracteres
Espero que esto haya ayudado ... Gracias ...
fuente
swift 3.0
Este código funciona bien cuando pega una cadena más allá de los límites de su carácter.
Gracias por vuestros votos. :)
fuente
Doy una respuesta complementaria basada en @Frouo. Creo que su respuesta es la forma más bella. Porque es un control común que podemos reutilizar.
fuente
Esta es la forma correcta de manejar la longitud máxima en UITextField, permite que la tecla de retorno salga del campo de texto para renunciar como primer respondedor y permite que el usuario retroceda cuando alcance el límite
fuente
¿Qué pasa con este enfoque simple? esta trabajando bien para mi.
Entonces:
fuente
Otras respuestas no manejan el caso en el que el usuario puede pegar una cadena larga desde el portapapeles. Si pego una cadena larga, debería truncarse pero mostrarse. Use esto en su delegado:
fuente
Lo bajé a 1 línea de código :)
Establezca el delegado de su vista de texto en "self" y luego agregue el
<UITextViewDelegate>
.h y el siguiente código en su .m ... puede ajustar el número "7" para que sea lo que quiera que sea su número MÁXIMO de caracteres.Este código explica escribir nuevos caracteres, eliminar caracteres, seleccionar caracteres y luego escribir o eliminar, seleccionar caracteres y cortar, pegar en general y seleccionar caracteres y pegar.
¡Hecho!
Alternativamente, otra forma genial de escribir este código con operaciones de bits sería
fuente
He abierto una subclase de UITextField, STATextField , que ofrece esta funcionalidad (y mucho más) con su
maxCharacterLength
propiedad.fuente
ahora cuántos caracteres quieres solo da valores
fuente
Use este código aquí RESTRICTED_LENGTH es la longitud que desea restringir para el campo de texto.
fuente
Hice esto en Swift para un límite de 8 caracteres al usar un teclado numérico.
Tuve que probar la cadena! = "" Para permitir que el botón Eliminar funcionara en el teclado numérico, de lo contrario no permitiría eliminar caracteres en el campo de texto después de alcanzar su máximo.
fuente
Para Xamarin:
fuente
He implementado una extensión UITextField para agregarle una propiedad maxLength.
Se basa en Xcode 6 IBInspectables, por lo que puede establecer el límite maxLength en el generador de interfaces.
Aquí está la implementación:
fuente