2010-03-26 18 views

Respuesta

230

Esto funciona correctamente con la tecla de retroceso y copiar & 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 devolución incluso cuando está MAXLENGTH. Gracias Sr. Rogers!

+13

Esta respuesta es excelente. Mejor que el aceptado. –

+1

Esta respuesta es la única que realmente funciona cuando el usuario intenta pegar en una cadena larga. Por favor, voto a favor! – JosephH

+0

+1 para un código muy claramente escrito. – PEZ

39

ACTUALIZACIÓN

No puedo eliminar esta respuesta ya que es el aceptado, pero que no era correcto. Aquí está el código correcto, copiado de TOMA 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 UITextField. Si es así, entonces hay una manera simple.

  1. implementar el protocolo UITextFieldDelegate
  2. Implementar el método textField:shouldChangeCharactersInRange:replacementString:.

Este método se invoca en cada toque de personaje o reemplazo de personaje anterior. en este método, puede 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; 
} 
+1

Sí, significaba UITextField, edité mi pregunta. Lo tengo. Gracias por tu respuesta. Esto funciona para mi ! – Elegya

+1

También debe asignar el delegado adecuado a UITExtField. – Ecarrion

+11

Esto es algo defectuoso: 1) al verificar la longitud del texto del campo existente (y no la nueva longitud propuesta) permite que el usuario tenga 1 carácter más allá del máximo, y 2) no impide que los usuarios copien y peguen más texto en. –

1

Creo que no hay tal propiedad.

Pero el texto que asigna a UILabel tiene que ser un NSString. Y antes de asignar esta cadena a la propiedad text del UILabel puede por ejemplo utilizar el siguiente método para NSString quitar de la cadena a un índice dado (su maxlength):

- (NSString *)substringToIndex:(NSUInteger)anIndex 
+1

Desafortunadamente, la pregunta asker cambió su pregunta después de que usted respondió, por lo que su respuesta ya no tiene sentido :( – JosephH

16

Una mejor función que admite retrocesos correcta y límites los caracteres del límite de longitud suministrado son los siguientes:

#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; 
    } 

¡Salud!

+2

Creo que no necesita subserrar el campo de texto – Ecarrion

+0

este funciona mucho mejor para mí :) gracias – Peter

+4

Esto no impide la longitud supera el máximo cuando el usuario pega una cadena que es más larga que el máximo. – JosephH

4

creo que este código podría hacer 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 delegado se puede prevenir al usuario añadir más caracteres que MAX_LENGTH a su campo de texto y el usuario debe permitir que ingrese retrocesos si es necesario .

+0

Esto no cubre completamente el caso donde el usuario está pegando; permite que la cuerda sea demasiado larga. – JosephH

1

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; 
} 
+0

Esto no impide que la longitud supere el máximo cuando el usuario pega una cadena más larga que 1. – Shebuka

2

Para mí esto lo hizo la magia:

if (textField.text.length >= 10 && range.length == 0) 
    return NO; 
return YES; 
-2

Es necesario asignar delegado en ViewDidLoad

TextFieldname.delegate=self 
+2

Esta no es una respuesta completa. La implementación del delegado sería más interesante. –

1

así es como he resuelto ese problema. Cuando se alcanza el límite máximo no lo puedo tratar de añadir más ... sólo serás capaz de eliminar caracteres

(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { 
if ([textfield.text length] > MAX_SIZE && ![string isEqualToString:@""]) { 
    return NO; 
} 
} 
1

Hay que ser consciente de la ubicación del texto se coloca en, así como la longitud del ser texto agregado (en caso de que estén pegando más de un personaje). 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; 
} 
11

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 sería demasiado largo, cambia los caracteres en el rango y trunca el texto resultante hasta el 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; 
}