【问题标题】:ReactiveCocoa: limit the input length of UITextfield but allow unlimited length when selecting charactersReactiveCocoa:限制 UITextfield 的输入长度,但在选择字符时允许无限长度
【发布时间】:2015-07-07 19:00:20
【问题描述】:

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

UITextField's 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 with ReactiveCocoa中,我的view model中无法获得对UITextField的引用,如何同时获得文本字段的marked rangetext

【问题讨论】:

    标签: ios mvvm reactive-cocoa


    【解决方案1】:

    我认为输入汉字的逻辑是用户输入的助手,因此视图模型不应该知道这一点。

    基于对your previous question 的回答,您可以执行以下操作:

    UITextField 类别中添加类似于-rac_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];
        }];
    }
    

    【讨论】:

      猜你喜欢
      • 2015-05-24
      • 1970-01-01
      • 1970-01-01
      • 2015-02-05
      • 1970-01-01
      • 2014-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多