Ios ReactiveCocoa:限制UITextfield的输入长度,但在选择字符时允许无限长度

Ios ReactiveCocoa:限制UITextfield的输入长度,但在选择字符时允许无限长度,ios,mvvm,reactive-cocoa,Ios,Mvvm,Reactive Cocoa,用中文输入文本时,输入英文字符,然后选择中文字符,在选择中文字符之前,英文字符处于选定状态(-markedRange)。 在使用ReactiveCocoa之前,我可以这样做: 在UITextField的UIControlEventEditingChanged事件回调中: const NSUInteger limitLength = 10; NSString *tobeString = textField.text; UITextRange *selectedRange =

用中文输入文本时,输入英文字符,然后选择中文字符,在选择中文字符之前,英文字符处于选定状态(-markedRange)。
在使用ReactiveCocoa之前,我可以这样做:

UITextField的UIControlEventEditingChanged
事件回调中:

    const NSUInteger limitLength = 10;
    NSString *tobeString = textField.text;
    UITextRange *selectedRange = [textField markedTextRange];
    BOOL nothingSelected = (selectedRange==nil || selectedRange.isEmpty);
    if (nothingSelected) {
        if (tobeString.length > addressItemNameLimitLength) {
            textField.text = [tobeString substringToIndex:limitLength];
        }
    }
    self.textField.text = textField.text;

<> >在“代码> MVVM具有RealEctuoCoA < /代码>中,我不能在<代码>视图模型< /代码>中引用<代码> UITExtField<代码>,我如何同时获得文本字段的<代码>标记范围< /代码>和<代码>文本< /代码>?

< P>我认为输入汉字作为用户输入的帮助器的逻辑,因此,视图模型不应该知道这一点

基于答案,您可以这样做:

UITextField
类别中,添加类似于
-rac\u textSignal
的信号,但如果编辑期间存在非空的选定范围,则不会触发:

- (RACSignal *)textSignalForChineseInput {
    RACSignal* editingEventsSignal = [[[self rac_signalForControlEvents:UIControlEventEditingChanged]
                                      filter:^BOOL(UITextField* x) {
                                          return x.selectedTextRange == nil || x.selectedTextRange.isEmpty;
                                      }]
                                      merge:[self rac_signalForControlEvents:(UIControlEventAllEditingEvents & ~UIControlEventEditingChanged)]];

    @weakify(self)
    return [[[[[RACSignal
        defer:^RACSignal *{
            @strongify(self)
            return [RACSignal return:self];
        }]
        concat:editingEventsSignal]
        map:^id(UITextField* x) {
            return x.text;
        }]
        takeUntil:self.rac_willDeallocSignal]
        setNameWithFormat:@"%@ -rac_textSignalForChineseInput", self.rac_description];
}
从某种角度来看:

RAC(self.textField, text) = [self.viewModel validatedTextWithSignal:self.deviceName.rac_textSignal];
在视图模型中:

- (RACSignal *)validatedTextWithSignal:(RACSignal *)signal {
    NSUInteger kMaxLength = 5;
    return [signal map:^id(NSString *text) {
        return text.length <= kMaxLength ? text : [text substringToIndex:kMaxLength];
    }];
}
-(RACSignal*)用信号验证文本:(RACSignal*)信号{
NSU整数kMaxLength=5;
return[信号映射:^id(NSString*text){
返回text.length