点击键盘上的删除按钮后,TextView 文本未删除文本

UiITextView text is not deleting the text after tapping the delete button on the keyboard

我有一个名为 myTextView 的 UITextView 和一个名为 charLabel 的 UILabel。

我使用 UITextView 委托方法更新标签以计算剩余的字符数(35 及以下)。

错误 - 在我在文本视图中写入文本并且标签变为 0 后,我无法删除文本...,我可以删除任何数字,但只有当我到达 0 时我才会卡住..

这是我的代码:

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

    self.charLabel.text = [NSString stringWithFormat:@"%lu",35 - (unsigned long)textView.text.length];
}

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

    textView.text = [textView.text stringByReplacingOccurrencesOfString:@"\n" withString:@" "];
    if(textView.text.length >= 35){
        return NO;
    } else {
        return YES;
    }

}

希望得到一些帮助,谢谢!

要以非常简单的方式执行此操作,您可以使用有关它们的 ReactiveCoca and you can check this 教程。它非常强大的库。

如果您想继续处理您的案例,以下代码可能会帮助您了解如何操作:

@implementation yourViewController
    - (void)viewDidLoad {
        [super viewDidLoad];
        _textView.delegate = self;
    }
    - (void)textViewDidBeginEditing:(UITextView *)textView {
        [_textView setText:@""];
    }

    - (void)textViewDidChange:(UITextView *)textView {
        [_charLabel setText:[NSString stringWithFormat:@"%d",(int)(35 - textView.text.length)]];
    }

    NSString *holderString = [textView.text stringByReplacingCharactersInRange:range withString:text];

if(holderString.length > 35)
    return NO;
else
    return YES;

并且确保您已将委托连接到 textView 的自身。

可以作为您如何在 Reactive 中使用的示例:

[[self.textView.rac_textSignal
  map:^id(NSString *text) {
      return @(text.length);
  }]
 subscribeNext:^(id x) {

     int xToInt = (int)x/16;

     if (xToInt > 0)  //this provide to keep the count stable when user do "select all and delete".
            [_charLabel setText:[NSString stringWithFormat:@"%d",35 - xToInt]];

     else
         [_counterLabel setText:@"35"];

     if (xToInt > 35)
            [_charLabel setTextColor:[UIColor redColor]];
     else
         [_charLabel setTextColor:[UIColor colorWithRed:179/255.0 green:179/255.0 blue:179/255.0 alpha:1.0]];

 }];

目前,如果字符数为 35 或更多,则任何更改都将被拒绝,因为您在委托方法中 return 否。

你应该在这里检查用户是添加了一个字符还是删除了一个字符,并做出相应的回应。

我不确定我是怎么想的,但你应该能够通过在委托方法中记录变量并按下删除按钮来解决这个问题。

是的,Rengers 的回答是正确的。一旦达到 35 个字符,您将拒绝对文本进行任何更改(即使用户试图 删除 个字符)。

我还没有测试过这段代码,但你应该做的是 "calculating" 新字符串是什么,在用户拥有 added/deleted 他的当前字符之后,并测量其长度那个字符串。

-(BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text1
{
    NSString *newString = [textView.text stringByReplacingCharactersInRange:range withString:text1];

    if(newString.length >= 35){
        return NO;
    } else {
        return YES;
    }
}