reactcocoa true shouldChangeCharactersInRange 文本字段等效 [英] reactivecocoa true shouldChangeCharactersInRange textfield equivalent

查看:97
本文介绍了reactcocoa true shouldChangeCharactersInRange 文本字段等效的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我从reactiveCocoa 开始,我在UITextfield 上遇到了一些麻烦.我尝试对 textField 进行基本检查以仅显示 4 位数字.

i begin with reactiveCocoa and i have some trouble with UITextfield. i try to do a basic check on a textField to display only 4 digit.

我尝试遵循这个例子:http://nshipster.com/reactivecocoa/但在这里, shouldChangeCharactersInRange 始终为真,因此文本字段始终更新.

i try to follow this exemple: http://nshipster.com/reactivecocoa/ but in here, shouldChangeCharactersInRange is always true so the textfield is always updated.

我尝试了两种解决方案:

i tried 2 solution :

[RACSignal combineLatest:@[self.pinDigitField.rac_textSignal]
 reduce:^(NSString *pinDigit) {
       NSCharacterSet *numbersOnly =[NSCharacterSet characterSetWithCharactersInString:@"0123456789"];
       NSCharacterSet *characterSetFromTextField = [NSCharacterSet characterSetWithCharactersInString:pinDigit];

return @([numbersOnly isSupersetOfSet:characterSetFromTextField] && text.length < 5);
                                                  }];

还有这个

[[self.pinDigitField.rac_textSignal
  filter:^BOOL(id value) {
      NSString *text = value; 
      NSCharacterSet *numbersOnly = [NSCharacterSet characterSetWithCharactersInString:@"0123456789"];
      NSCharacterSet *characterSetFromTextField = [NSCharacterSet characterSetWithCharactersInString:text];

      BOOL stringIsValid = [numbersOnly isSupersetOfSet:characterSetFromTextField] && text.length < 5 ;return stringIsValid;
  }]subscribeNext:^(id x) {
      NSLog(@"valid");
  }];

在这两种情况下,我都不能简单地不在 UITextfield 中编写新字符.

in both case i can't simply not write the new caracter in the UITextfield.

有人有想法吗?

推荐答案

我尝试对 textField 进行基本检查以仅显示 4 位数

i try to do a basic check on a textField to display only 4 digit

让我们首先将文本信号分配给文本字段的 text 属性:

Let's start by assigning the text signal to the text property of the text field:

RAC(self.textField, text) = self.textField.rac_textSignal;

现在每次文本字段更改时,textField.text 都会设置为文本字段的内容.像这样毫无意义,但现在我们可以将值映射为仅允许数字:

Now every time the text field changes, textField.text is set to the content of the text field. Pretty pointless like this, but now we can map the values to only allow numbers:

RAC(self.textField, text) = [self.textField.rac_textSignal map:^id(NSString *value) {
    return [value stringByTrimmingCharactersInSet:[[NSCharacterSet decimalDigitCharacterSet] invertedSet]];
}];

要将文本字段限制为仅 4 个字符,您不能使用过滤器.过滤器会阻止信号触发,但因为您在文本字段中输入,您仍然会在其中获得更改.相反,让我们使用另一个映射将所有值修剪为 4 的长度:

To limit the text field to only 4 characters you can't use a filter. A filter would prevent the signal from firing, but because you are typing in the text field you would still get changes in it. Instead let's use another map to trim all values to a length of 4:

RAC(self.textField, text) = [[self.textField.rac_textSignal map:^id(NSString *value) {
    return [value stringByTrimmingCharactersInSet:[[NSCharacterSet decimalDigitCharacterSet] invertedSet]];
}] map:^id(NSString *value) {
    if (value.length > 4) {
        return [value substringToIndex:4];
    } else {
        return value;
    }
}];

这篇关于reactcocoa true shouldChangeCharactersInRange 文本字段等效的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆