web-dev-qa-db-ja.com

UITextViewのテキスト長をどのように修正できますか?

私はUITextViewを持っていますが、ユーザーはtextViewに最大160文字を書き込むことができます。 UITextViewの最大テキスト長を固定するにはどうすればよいですか?

25
faisal

交換する

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

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

これは答えられます ここ

15

このコードのチャンクはコピー/貼り付けでも機能しますが、テキストビューが制限を超える文字数を貼り付けようとする場合の状況にも対応します。その場合、文字列の最初の文字のみが貼り付けられます。

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

この答えに遅れます。 manicaesarの解決策は私にはうまくいきませんでした。これが同じアイデアの私の実装です:

#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;
}
14
Henry Cooke

Swift 4、

コードを再利用可能にするために、Swift 4にUITextViewの拡張機能を記述しました。コピーペーストでも問題なく機能します。

    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

1
Pramod More

スウィフト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
        }

    }
0