【问题标题】:how text length of a UITextView can be fixed?如何修复 UITextView 的文本长度?
【发布时间】:2011-01-02 00:02:57
【问题描述】:

我有一个 UITextView,用户最多可以在 textView 中写入 160 个字符。 如何修复 UITextView 的最大文本长度?

【问题讨论】:

  • 这不是重复的......用户需要一种方法来确定UITextView而不是UITextField的长度

标签: iphone uitextview


【解决方案1】:

这段代码也适用于复制/粘贴,但也适用于尝试粘贴会使文本视图超出限制的字符数的情况。在这种情况下,只会粘贴字符串的第一个字符。

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

【讨论】:

  • 唯一的问题(除非它只是我的实现)是如何让一个计数器来处理这个问题。
  • “计数器”是什么意思?在文本视图中显示字符数?如果是,您可以在 textView:textDidChange: 方法中更新计数器(它适用于我的项目)。
  • NSUInteger emptySpace = MIN(0, MAX_LENGTH - (textView.text.length - range.length));如果您可能有比允许的最大值更长的现有文本,那就更好了。
【解决方案2】:

替换

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

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

回答here

【讨论】:

    【解决方案3】:

    这个答案迟到了; 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;
    }
    

    【讨论】:

    • 我更喜欢这种方法,因为它在粘贴超过 MAX_LENGTH 的文本时也会限制字符。请注意,将 'replacementText' 替换为 'text' 以避免错误。
    • 完美,不会崩溃
    【解决方案4】:

    斯威夫特 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)
      }
    
    }
    

    在情节提要中设置最大长度值,

    【讨论】:

      【解决方案5】:

      斯威夫特

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

      【讨论】:

        猜你喜欢
        • 2018-11-30
        • 1970-01-01
        • 1970-01-01
        • 2021-06-28
        • 2015-06-26
        • 1970-01-01
        • 2020-05-01
        • 2010-11-13
        • 2013-07-09
        相关资源
        最近更新 更多