Как можно исправить длину текста UITextView? - PullRequest
24 голосов
/ 06 января 2010

У меня есть UITextView, пользователь может написать максимум 160 символов в textView. Как я могу исправить максимальную длину текста UITextView?

Ответы [ 5 ]

58 голосов
/ 05 мая 2011

Этот фрагмент кода также работает с копированием / вставкой, но также справляется с ситуацией при попытке вставить количество символов, из-за которого текстовое представление превышает лимит. В этом случае вставляются только первые символы строки.

#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;
    }
}
15 голосов
/ 06 января 2010

Заменить

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

с

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

на который дан ответ здесь

13 голосов
/ 01 марта 2014

опаздываете на этот ответ; Решение Маникесара не сработало для меня. Вот моя реализация той же идеи:

#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;
}
1 голос
/ 18 июня 2018

Swift 4,

Я написал расширение UITextView в swift 4 для обеспечения возможности повторного использования кода. Также отлично работает с копировальной пастой.

    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)
  }

}

Установить максимальное значение длины в раскадровке,

enter image description here

0 голосов
/ 06 сентября 2017

Свифт 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
        }

    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...