单击键盘上的删除按钮后,TextView文本不会删除文本

时间:2015-03-18 22:36:57

标签: ios objective-c uitextview

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

我使用UITextView委托方法更新标签以计算剩下的char(35和更低)。

错误 - 在textview中写文本并且标签变为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;
    }

}

很想得到一些帮助,谢谢!

3 个答案:

答案 0 :(得分:1)

是的, Rengers 的回答是正确的。一旦获得35个字符,您就会拒绝对文本进行任何更改(即使用户正在尝试删除字符)。

我还没有测试过这段代码,但你应该做的是"计算"在用户添加/删除当前字符并测量 字符串的长度后,新字符串将是什么。

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

答案 1 :(得分:0)

要以非常简单的方式执行此操作,您可以使用ReactiveCoca,然后查看有关它们的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;

确保您已将委托与self连接为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]];

 }];

答案 2 :(得分:0)

目前,如果字符数为35或更多,则拒绝任何更改,因为您在委托方法中返回NO。

您应该在此处检查用户是否添加了字符或删除字符并做出相应的响应。

我不知道如何从头顶开始,但你应该能够通过在委托方法中记录变量并按下删除按钮来解决这个问题。