Ios ReactiveCocoa:限制UITextfield的输入长度,但在选择字符时允许无限长度
用中文输入文本时,输入英文字符,然后选择中文字符,在选择中文字符之前,英文字符处于选定状态(-markedRange)。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 =
在使用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