ios - reactcocoa是true应该ChangeCharactersInRange文本字段等效

标签 ios objective-c uitextfield reactive-cocoa

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

我尝试遵循以下示例:
http://nshipster.com/reactivecocoa/
但是在这里,shouldChangeCharactersInRange始终为true,因此文本字段始终会更新。

我尝试了2解决方案:

[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中编写新角色。

有人有主意吗?

最佳答案

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

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

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

现在,每次文本字段更改时,textField.text都会设置为文本字段的内容。像这样非常没有意义,但是现在我们可以将值映射为仅允许数字:
RAC(self.textField, text) = [self.textField.rac_textSignal map:^id(NSString *value) {
    return [value stringByTrimmingCharactersInSet:[[NSCharacterSet decimalDigitCharacterSet] invertedSet]];
}];

要将文本字段限制为仅4个字符,您不能使用过滤器。过滤器可以防止信号触发,但是由于您在文本字段中键入内容,因此仍然可以对其进行更改。相反,让我们使用另一个映射将所有值修剪为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;
    }
}];

关于ios - reactcocoa是true应该ChangeCharactersInRange文本字段等效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23905556/

相关文章:

ios - 带有 UISearchBar 作为标题 View 的 UITableView 导致崩溃

ios - 如何将 'CapitalizedString' 与土耳其字母一起使用?

ios - 为什么我复制的 SKLabelNode 显示在屏幕上的不同位置,尽管它与原始节点具有相同的框架和位置?

ios - 获取我附近的清真餐厅的列表FourSquare API

html - 如何在 iOS 中分隔 xml 标记内的值

ios - 在不禁用上下文菜单的情况下管理 UITextfiled 上的长按?

ios - 如何跳出 IBAction?

iphone - 输入大文本时文本字段的大小会发生变化

ios - 使用由按钮组成的自定义键盘将文本附加到 UITextField

iOS >> 协议(protocol)和委托(delegate)概念