iphone - fields - Establecer UITextField Longitud Máxima
text field ios 11 (11)
Esta pregunta ya tiene una respuesta aquí:
¿Hay alguna manera de establecer la longitud máxima en un UITextField?
Algo parecido al atributo MAXLENGTH en los campos de entrada HTML.
Así es como resolví ese problema. Cuando se alcanza el límite máximo, no se intentará agregar más ... solo podrá eliminar caracteres
#define MAX_SIZE ((int) 5)
...
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
if ([textField.text length] >= MAX_SIZE && ![string isEqualToString:@""]) {
return NO;
}
return YES;
}
Creo que este código haría el truco:
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range
replacementString:(NSString*)string
{
if (range.location >= MAX_LENGTH)
return NO;
return YES;
}
Con este método de delegado, puede evitar que el usuario agregue más caracteres que MAX_LENGTH a su campo de texto y se le debe permitir al usuario ingresar espacios de retroceso si es necesario.
Creo que no hay tal propiedad.
Pero el texto que asigne a la UILabel tiene que ser una NSString. Y antes de asignar esta cadena a la propiedad de texto de UILabel, por ejemplo, puede usar el siguiente método de NSString para recortar la cadena en un índice determinado (su longitud máxima):
- (NSString *)substringToIndex:(NSUInteger)anIndex
Debe conocer la ubicación en la que se coloca el texto y la longitud del texto que se agrega (en caso de que estén pegando más de un carácter). El patrón entre estos con respecto a la longitud máxima es que su suma nunca debe exceder la longitud máxima.
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
NSInteger locationAndStringLengthSum = range.location + [string length];
if ([textField isEqual:_expirationMonthField]) {
if (locationAndStringLengthSum > EXP_MONTH_FIELD_MAX_CHAR_LENGTH) {
return NO;
}
}
else if ([textField isEqual:_expirationYearField]) {
if (locationAndStringLengthSum > EXP_YEAR_FIELD_MAX_CHAR_LENGTH) {
return NO;
}
}
else if ([textField isEqual:_securityCodeField]) {
if (locationAndStringLengthSum > SECURITY_FIELD_MAX_CHAR_LENGTH) {
return NO;
}
}
else if ([textField isEqual:_zipCodeField]) {
if (locationAndStringLengthSum > ZIP_CODE_MAX_CHAR_LENGTH) {
return NO;
}
}
return YES;
}
Este código limita el texto al mismo tiempo que le permite ingresar caracteres o pegar en cualquier parte del texto. Si el texto resultante es demasiado largo, cambia los caracteres en el rango y trunca el texto resultante al límite.
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
NSUInteger newLength = [textField.text length] - range.length + [string length];
if (newLength >= MAXLENGTH) {
textField.text = [[textField.text stringByReplacingCharactersInRange:range withString:string] substringToIndex:MAXLENGTH];
return NO;
}
return YES;
}
Esto es similar a la respuesta de coneybeare, pero ahora el campo de texto puede contener un máximo de símbolos MAXLENGTH:
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
if ([textField.text length] > MAXLENGTH - 1) {
textField.text = [textField.text substringToIndex:MAXLENGTH];
return NO;
}
return YES;
}
Esto funciona correctamente con retroceso y copiar y pegar:
#define MAXLENGTH 10
- (BOOL)textField:(UITextField *) textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
NSUInteger oldLength = [textField.text length];
NSUInteger replacementLength = [string length];
NSUInteger rangeLength = range.length;
NSUInteger newLength = oldLength - rangeLength + replacementLength;
BOOL returnKey = [string rangeOfString: @"/n"].location != NSNotFound;
return newLength <= MAXLENGTH || returnKey;
}
ACTUALIZACIÓN: actualizado para aceptar la clave de retorno, incluso cuando está en MAXLENGTH. Gracias Sr. Rogers!
Necesitas asignar delegado en ViewDidLoad
TextFieldname.delegate=self
Para mí esto hizo la magia.
if (textField.text.length >= 10 && range.length == 0)
return NO;
return YES;
Una función mejor que controla correctamente los espacios en blanco y limita los caracteres al límite de longitud suministrado es la siguiente:
#define MAXLENGTH 8
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
int length = [textField.text length] ;
if (length >= MAXLENGTH && ![string isEqualToString:@""]) {
textField.text = [textField.text substringToIndex:MAXLENGTH];
return NO;
}
return YES;
}
¡Aclamaciones!
ACTUALIZAR
No puedo eliminar esta respuesta porque es la aceptada, pero no fue correcta. Aquí está el código correcto, copiado de TomA a continuación:
#define MAXLENGTH 10
- (BOOL)textField:(UITextField *) textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
NSUInteger oldLength = [textField.text length];
NSUInteger replacementLength = [string length];
NSUInteger rangeLength = range.length;
NSUInteger newLength = oldLength - rangeLength + replacementLength;
BOOL returnKey = [string rangeOfString: @"/n"].location != NSNotFound;
return newLength <= MAXLENGTH || returnKey;
}
ORIGINAL
Creo que te refieres a UITextField. Si es así, entonces hay una manera simple.
- Implementar el protocolo UITextFieldDelegate
- Implementa el
textField:shouldChangeCharactersInRange:replacementString:
.
Ese método se invoca en cada toque de carácter o reemplazo de carácter anterior. En este método, puedes hacer algo como esto:
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
if ([textField.text length] > MAXLENGTH) {
textField.text = [textField.text substringToIndex:MAXLENGTH-1];
return NO;
}
return YES;
}