限制uitextview中的字符数

har*_*alb 75 iphone uitextview uitextviewdelegate ios

我正在给一个文本视图来推特一些字符串.

我正在应用以下方法将字符数限制为140.

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


    if([text isEqualToString:@"\b"]){
        DLog(@"Ohoooo");
        return YES;
    }else if([[textView text] length] > 140){

        return NO;
    }

    return YES;
}
Run Code Online (Sandbox Code Playgroud)

除了退格不起作用的第一个条件之外,代码运行良好.假设我已达到140个字符的限制,因此该方法将给我假,用户无法插入更多字符,但在此之后,当我尝试删除某些字符时,文本视图的行为与禁用时相同.

那么问题是如何从textview.text文本视图中删除字符或重新启用文本视图.

Tim*_*Tim 151

- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text
{
    return textView.text.length + (text.length - range.length) <= 140;
}
Run Code Online (Sandbox Code Playgroud)

这可以解释用户剪切文本,或删除长于单个字符的字符串(即,如果他们选择然后点击退格键),或者突出显示范围并将字符串粘贴的时间比它短或长.

Swift 2.0版本

 func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
    return textView.text.count + (text.count - range.length) <= 140
}
Run Code Online (Sandbox Code Playgroud)

  • 必须使您的视图控制器成为 UITextViewDelegate,然后将文件的所有者连接为文本视图的委托 (2认同)

Dav*_*har 63

你应该寻找一个空字符串,正如苹果参考文献所说的那样

如果用户按下Delete键,则范围的长度为1,空字符串对象将替换该单个字符.

我认为你实际想做的检查就像是[[textView text] length] - range.length + text.length > 140为了解决剪切/粘贴操作.

  • 我认为您实际想要的检查类似于`[[textView text] length] - range.length + text.length> 140`,以考虑剪切/粘贴操作. (9认同)
  • [[textView text] length] - range.length + text.length> 140应为[[textView text] length] - range.length + text.length <140 (2认同)

Roh*_*dia 16

对于swift 4:

//MARK:- TextView Delegate
func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
    //300 chars restriction
    return textView.text.count + (text.count - range.length) <= 300
}
Run Code Online (Sandbox Code Playgroud)


小智 10

但是你也可以使用下面的工作代码..

- (void)textViewDidChange:(UITextView *)textView{

    NSInteger restrictedLength=140;

    NSString *temp=textView.text;

    if([[textView text] length] > restrictedLength){
        textView.text=[temp substringToIndex:[temp length]-1];
    }
}
Run Code Online (Sandbox Code Playgroud)


Ima*_*tit 7

使用 Swift 5 和 iOS 12,尝试以下textView(_:shouldChangeTextIn:replacementText:)方法的实现,这是UITextViewDelegate协议的一部分:

func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
    guard let rangeOfTextToReplace = Range(range, in: textView.text) else {
        return false
    }
    let substringToReplace = textView.text[rangeOfTextToReplace]
    let count = textView.text.count - substringToReplace.count + text.count
    return count <= 10
}
Run Code Online (Sandbox Code Playgroud)
  • 这段代码最重要的部分是从range( NSRange) 到rangeOfTextToReplace( Range<String.Index>)的转换。请参阅此视频教程以了解为什么这种转换很重要。
  • 为了使此代码正常工作,您还应该将textFieldsmartInsertDeleteType值设置为UITextSmartInsertDeleteType.no。这将防止在执行粘贴操作时可能插入(不需要的)额外空间。

下面的完整示例代码展示了如何textView(_:shouldChangeTextIn:replacementText:)在 a 中实现UIViewController

import UIKit

class ViewController: UIViewController, UITextViewDelegate {

    @IBOutlet var textView: UITextView! // Link this to a UITextView in Storyboard

    override func viewDidLoad() {
        super.viewDidLoad()

        textView.smartInsertDeleteType = UITextSmartInsertDeleteType.no
        textView.delegate = self
    }

    func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
        guard let rangeOfTextToReplace = Range(range, in: textView.text) else {
            return false
        }
        let substringToReplace = textView.text[rangeOfTextToReplace]
        let count = textView.text.count - substringToReplace.count + text.count
        return count <= 10
    }

}
Run Code Online (Sandbox Code Playgroud)


Moj*_*ini 6

限制溢出,而不是整个文本!

通过false...shouldChangeTextInRange...委托方法中返回,您实际上是在限制整个文本并且处理以下情况可能非常困难:

  • 复制和粘贴
  • 选择文本区域并编辑
  • 使用自动建议
  • 使用语音输入(语音命令或听写)

这样你就可以:

只需限制文本溢出!

通过删除多余的字符:

textView.text = String(textView.text.prefix(140))
Run Code Online (Sandbox Code Playgroud)

你甚至可以在飞行中做到!通过把这段代码里面行动textViewtextField与该.editingChanged事件。

  • 将其放置在 UITextView 委托的 `func textViewDidChange(_ textView: UITextView) {...}` 中效果很好,仅裁剪长粘贴文本的末尾 (2认同)

Bal*_*llu 5

是的

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

    int limit = 139;

    return !([textField.text length]>limit && [string length] > range.length);

}
Run Code Online (Sandbox Code Playgroud)

这只会输入140个字符,如果需要你可以删除它们


Ale*_*kov 5

迅速:

// MARK: UITextViewDelegate

let COMMENTS_LIMIT = 255

func textView(textView: UITextView,  shouldChangeTextInRange range:NSRange, replacementText text:String ) -> Bool {
    return count(comments.text) + (count(text) - range.length) <= COMMENTS_LIMIT;
}
Run Code Online (Sandbox Code Playgroud)