Tengo un UITextView, el usuario puede escribir un máximo de 160 caracteres en el textView.
¿Cómo puedo fija el máximo de la longitud del texto de un UITextView?

  • Esto NO es un duplicado…. El usuario necesita un método para determinar la longitud de un UITextView no UITextField
InformationsquelleAutor faisal | 2010-01-06

5 Comentarios

  1. 15

    Reemplazar

     - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string

    con

    - (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text

    que es respondida aquí

  2. 58

    Este fragmento de código también funciona con Copiar/Pegar, pero también hace frente a la situación cuando se trata de pegar el número de caracteres que se hacen de la vista de texto excede el límite. En ese caso, sólo los primeros caracteres de la cadena son pegadas.

    #define MAX_LENGTH 15 //Whatever your limit is
    - (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text
    {
        NSUInteger newLength = (textView.text.length - range.length) + text.length;
        if(newLength <= MAX_LENGTH)
        {
            return YES;
        } else {
            NSUInteger emptySpace = MAX_LENGTH - (textView.text.length - range.length);
            textView.text = [[[textView.text substringToIndex:range.location] 
                                                stringByAppendingString:[text substringToIndex:emptySpace]]
                                             stringByAppendingString:[textView.text substringFromIndex:(range.location + range.length)]];
            return NO;
        }
    }
    • Una solución superior
    • El único problema (a menos que sea sólo mi aplicación) es cómo conseguir un contador para trabajar con este.
    • ¿Qué entiende usted por ‘contador’? Mostrar el número de caracteres en la vista de texto? Si sí, usted puede actualizar el contador en el textView:textDidChange: método (funciona en mi proyecto).
    • NSUInteger emptySpace = MIN(0, MAX_LENGTH – (textView.texto.la longitud de la gama.longitud)); es mejor si usted puede tener texto existente, que es más larga que el máximo permitido.
  3. 13

    Llegar tarde a esta respuesta; manicaesar la solución no funciona para mí. Aquí está mi aplicación de la misma idea:

    #define MAX_LENGTH 140
    - (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)replacementText
    {
        NSString *newText = [ textView.text stringByReplacingCharactersInRange: range withString: replacementText ];
        if( [newText length]<= MAX_LENGTH ){
            return YES;
        }
        //case where text length > MAX_LENGTH
        textView.text = [ newText substringToIndex: MAX_LENGTH ];
        return NO;
    }
    • Yo prefiero este método ya que también los límites de los personajes al pegar un texto que supera MAX_LENGTH. La mente usted, sustituir el ‘replacementText’ con ‘texto’ para evitar errores.
    • esto es perfecto, no se bloquea
  4. 1

    Swift 4,

    He escrito una extensión de UITextView en swift 4, por lo que el código es reutilizable. También funciona bien con copiar y pegar.

        private var maxLengths = [UITextView: Int]()
    
    extension UITextView : UITextViewDelegate {
    
      @IBInspectable var maxLength: Int {
    
        get {
    
          guard let length = maxLengths[self]
            else {
              return Int.max
          }
          return length
        }
        set {
          maxLengths[self] = newValue
          self.delegate = self
        }
      }
    
      @objc func limitLength(textView: UITextView) {
        guard let prospectiveText = textView.text,
          prospectiveText.count > maxLength
          else {
            return
        }
    
        let selection = selectedTextRange
        let maxCharIndex = prospectiveText.index(prospectiveText.startIndex, offsetBy: maxLength)
        text = String(prospectiveText[..<maxCharIndex])
        selectedTextRange = selection
    
      }
    
      public func textViewDidChange(_ textView: UITextView) {
        limitLength(textField:textView)
      }
    
      public func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
        scrollToBottom()
        return true
      }
    
      public func textViewShouldEndEditing(_ textView: UITextView) -> Bool {
        scrollToBottom()
        return true
      }
    
      func scrollToBottom() {
        let location = text.count - 1
        let bottom = NSMakeRange(location, 1)
        self.scrollRangeToVisible(bottom)
      }
    
    }

    Establecer la longitud máxima de valor en el guión gráfico,

    cómo longitud del texto de un UITextView puede ser fijo?

  5. 0

    Swift 3

    fileprivate let maxLen = 5
    
        extension MyViewController : UITextViewDelegate{
            func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
    
                let newLen = (textView.text.characters.count - range.length) + text.characters.count
                return newLen <= maxLen
            }
    
        }

Dejar respuesta

Please enter your comment!
Please enter your name here