reactivecocoa true shouldChangeCharactersInRange文本字段等效

我从reactiveCocoa开始,我在UITextfield有一些麻烦。 我尝试对textField进行基本检查,只显示4位数字。

我尝试遵循这个例子: http ://nshipster.com/reactivecocoa/但在这里,shouldChangeCharactersInRange总是为true,所以文本字段总是更新。

我试过2个解决scheme:

[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新的caracter。

有没有人有想法?

我尝试对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个字符,则不能使用filter。 filter可以防止信号发射,但是由于您在文本字段中input,您仍然可以在其中进行更改。 相反,让我们使用另一张地图将所有值修剪为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; } }];