限制uitextview中的字符数

时间:2010-03-22 12:45:33

标签: ios iphone uitextview uitextviewdelegate

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

我正在应用以下方法将字符数限制为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;
}

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

所以问题是如何从textview.text删除字符或重新启用文本视图。

17 个答案:

答案 0 :(得分:145)

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

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

Swift 2.0版

 func textView(textView: UITextView, shouldChangeTextInRange range: NSRange, replacementText text: String) -> Bool {
    return textView.text.characters.count + (text.characters.count - range.length) <= 140
}

答案 1 :(得分:60)

你应该寻找一个空字符串,因为apple reference

  

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

我认为您实际想要进行的检查类似于[[textView text] length] - range.length + text.length > 140,以便考虑剪切/粘贴操作。

答案 2 :(得分:15)

对于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
}

答案 3 :(得分:9)

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

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

    NSInteger restrictedLength=140;

    NSString *temp=textView.text;

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

答案 4 :(得分:5)

你这个

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

    int limit = 139;

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

}

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

答案 5 :(得分: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;
}

答案 6 :(得分:2)

虽然我需要一个if-else条件,所以这对我有用:

- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text
{
    BOOL status = textView.text.length + (text.length - range.length) <= 15;
    if (status)
    {
        [self.btnShare setEnabled:YES];
        [self.btnShare setAlpha:1];
    }
    else
    {
        [self.btnShare setEnabled:NO];
        [self.btnShare setAlpha:0.25];
    }
    return status;
}

按钮设置为禁用。但是,如果您希望用户无法发布空测试,只需在按钮上单击一个条件:

- (void)btnShare_click:(id)sender
{
    NSString *txt = [self.txtShare.text stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
    if ([txt length] == 0)
    {
        [self.btnShare setEnabled:NO];
        [self.btnShare setAlpha:0.25f];
        [[[UIAlertView alloc]initWithTitle:nil message:@"Please enter some text to share." delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil] show];
        return;
    }
    .
    .
    .
    .
    .
    .
    // rest of your code
}

答案 7 :(得分:2)

在Swift 5和iOS 12中,请尝试以下textView(_:shouldChangeTextIn:replacementText:)方法的实现,该方法是*.h协议的一部分:

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 } range)到NSRangerangeOfTextToReplace)的转换。请参阅此video tutorial,以了解这种转换为什么很重要。
  • 为使此代码正常工作,还应该将Range<String.Index>的{​​{3}}值设置为textField。这样可以防止在执行粘贴操作时可能会插入(多余的)多余空间。

下面的完整示例代码显示了如何在UITextSmartInsertDeleteType.no中实现textView(_:shouldChangeTextIn:replacementText:)

UIViewController

答案 8 :(得分:1)

@Tim Gostony的Swift版本:

reject

答案 9 :(得分:1)

我们在这里寻求最佳选择。 显示剩余字符数:&#39; n&#39;剩下的人物。

var charCount = 0;
let maxLength = 150
func textView(textView: UITextView, shouldChangeTextInRange range: NSRange, replacementText text: String) -> Bool {

    if text == "" // Checking backspace
    {
        if textView.text.characters.count == 0
        {
            charCount = 0
            characterCount.text = String(format: "%i Characters Left", maxLength - charCount)
            return false
        }
        charCount = (textView.text.characters.count - 1)
        characterCount.text = String(format: "%i Characters Left", maxLength - charCount)
      return true
    }
    else
    {
        charCount = (textView.text.characters.count + 1)
        characterCount.text = String(format: "%i Characters Left", maxLength - charCount)

        if charCount >= maxLength + 1
        {
            charCount = maxLength
            characterCount.text = String(format: "%i Characters Left", maxLength - charCount)
            return false;
        }
    }
    return true
}

答案 10 :(得分:1)

如果您还希望能够将代码粘贴到最大字符数,同时避免溢出并更新计数标签:

let maxChar: Int
let countLabel: UILabel

func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
    let oldChar = textView.text.count - range.length
    let oldRemainingChar = maxChar - oldChar
    let newChar = oldChar + text.count
    let newRemainingChar = maxChar - newChar
    let replaceChar = newRemainingChar > 0 ? text.count : oldRemainingChar

    if
        let textRange = textView.textRange(for: range),
        replaceChar > 0 || range.length > 0
    {
        textView.replace(textRange, withText: String(text.prefix(replaceChar)))
        countLabel.text = String(describing: maxChar - textView.text.count)
    }

    return false
}

扩展名:

extension UITextInput {
    func textRange(for range: NSRange) -> UITextRange? {
        var result: UITextRange?

        if
            let start = position(from: beginningOfDocument, offset: range.location),
            let end = position(from: start, offset: range.length)
        {
            result = textRange(from: start, to: end)

        }

        return result
    }
}

答案 11 :(得分:1)

上面给出的一些答案的问题是,例如我有一个文本字段,我必须设置15个字符输入的限制,然后在输入第15个字符后停止。但他们不允许删除。这是删除按钮也不起作用。因为我面临同样的问题。推出解决方案,给定下面。适合我的作品

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
 if(textField.tag==6)
 {
    if ([textField.text length]<=30)
    {
        return YES;   
    }
    else if([@"" isEqualToString:string])
    {
        textField.text=[textField.text substringToIndex:30 ];
    }

    return NO;
 }
 else
 {
    return YES;
 }
}

我有一个文本字段,我已经设置了标签&#34; 6&#34; 我限制了最大字符数限制= 30; 在每种情况下都能正常工作

答案 12 :(得分:0)

Use the following code...
- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text
{
    if(text.length == 0)
    {
        return YES;
    }
    else if(self.txtViewComments.text.length > 255)
    {
        return NO;
    }
    else
    {
        return YES;
    }
}

答案 13 :(得分:0)

textView:shouldChangeTextInRange:replacementText:方法中写下以下代码:

if ([textView.text length]>=3 && ![text isEqualToString:@""]) {
    return NO;
}
return YES;

答案 14 :(得分:0)

限制溢出,而不是全文!

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

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

因此您可以:

只需限制文本溢出

通过删除多余的字符:

textView.text = String(textView.text.prefix(140))

您甚至可以即时做到这一点!通过将此代码放在textView事件的textField.editingChanged action 中。

答案 15 :(得分:0)

Swift5:

let maxChars = 255

func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
  if maxChars - aTextView.text.count == 0 {
    if range.length != 1 {
    return false
    }
  }
  return true
}

答案 16 :(得分:0)

这是限制用户在iOS Swift中的UITextFieldUITextView中输入字符数的最简单解决方案

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool 
{
   return textField.text!.count < limit ? true : false
}

注意:这里的限制可以根据您的要求从1n,例如:如果您使用的电话号码超过limit的值将是10 如果您想在UITextView上应用相同的方法,则方法将被更改,而在textfield的位置,您将使用textview