2010-03-22 84 views
63

我正在给文本视图来推送一些字符串。限制uitextview中的字符数

我正在应用以下方法来限制长度为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中删除字符或重新启用文本视图。

+0

检查这个【答案】(http://stackoverflow.com/q/433337/1603234) – Hemang 2013-01-30 08:58:32

+0

@Hemang http://stackoverflow.com/a/41380869/2910061 – ilesh 2016-12-29 13:36:55

回答

53

你应该寻找一个空字符串,而不是作为apple reference

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

我认为您实际上想要制作的支票类似于[[textView text] length] - range.length + text.length > 140,以说明剪切/粘贴操作。

+0

谢谢,但可以更具体我不明白苹果 – harshalb 2010-03-22 12:56:29

+0

的技术规范告诉我,我应该在第一个条件。我gooling这个近4个小时 – harshalb 2010-03-22 12:59:27

+0

确定它像range.length == 1它工作正常 – harshalb 2010-03-22 13:03:24

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

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

雨燕2.0版本

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

这是一个IBAction?我如何将它作为用户类型连接到有问题的TextView? – learner 2014-08-12 19:04:08

+1

需要让你的视图控制器成为UITextViewDelegate,然后将文件所有者作为文本视图的代理来挂接 – Tim 2014-08-12 19:05:07

+0

我认为问一个跟进问题会更公平:我有两个UITextviews需要在同一个控制器中需要字符限制。你能帮忙吗? http://stackoverflow.com/questions/25272413/limit-number-of-characters-user-may-inter-into-multiple-uitextviews – learner 2014-08-12 19:25:18

9

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

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

    NSInteger restrictedLength=140; 

    NSString *temp=textView.text; 

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

一般不是编辑东西后的首选方式。在“shouldChangeCharactersInRange”中更好地检查它以防止文本被编辑。 – 2015-01-16 15:16:33

5

UE这个

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

    int limit = 139; 

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

} 

这样只会进入140字符,你可以删除他们如果需要

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

我有一个文本字段,它的标签我设置了“6” ,我已经限制了最大字符限制= 30; 在任何情况下工作正常,下面的代码

0

写在textView:shouldChangeTextInRange:replacementText:方法:

if ([textView.text length]>=3 && ![text isEqualToString:@""]) { 
    return NO; 
} 
return YES; 
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; 
    } 
} 
+0

如果使用条件从文本视图中删除字符 – 2014-09-12 10:23:43

4

斯威夫特:

// 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; 
} 
+0

'countElements'已在快速1中被'count'所取代。2 – 2015-04-21 10:27:25

+1

和在Swift 2你必须 textView.text.characters.count 或任何你想要的编码:https://developer.apple.com/swift/blog/?id = 30 – Heckscheibe 2015-08-27 07:11:50

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

@Tim Gostony的斯威夫特版本:

// restrict the input for textview to 500 
func textView(textView: UITextView, shouldChangeTextInRange range: NSRange, replacementText text: String) -> Bool { 
    return count(textView.text) + (count(text) - range.length) <= 500; 
} 
0

在这里,我们去最合适。显示剩余字符数:剩余'n'个字符。

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

尝试了这一点: -

func textView(textView: UITextView, shouldChangeTextInRange range: NSRange, replacementText text: String) -> Bool { 
    print("chars \(textView.text.characters.count) \(text)") 

    if(textView.text.characters.count > 20 && range.length == 0) { 
     print("Please summarize in 20 characters or less") 
     return false; 
    } 

    return true; 
} 
3

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