带有 ReactiveCocoa 的 MVVM:限制视图模型中 UITextField 的文本长度
MVVM with ReactiveCocoa: limit the text length of a UITextField in view model
我正在采用 MVVM 和 ReactiveCocoa。现在我有一个 UITextField,我需要将它的最大文本长度限制为 100。
在我看来:
- (void)bindViewModel
{
RAC(self.viewModel, text) = self.textField.rac_textSignal;
[RACObserve(self.viewModel, text) subscribeNext:(NSString *text) {
self.textField.text = text;
}];
}
在我的视图模型中
- (id)init
{
[RACObserve(self, text) subscribeNext:^(NSString *x) {
//block 1
if (x.length > maxTextLength) {
x = [x substringToIndex:maxTextLength];
}
}];
}
但这不起作用,block 1
从未被调用。
通过使用 MVVM,我认为文本长度控制逻辑应该放在我的视图模型中,但是实现这个的正确方法是什么?
如this answer中所述:您可以从文本字段中获取rac_textSignal
并使用map
到trim字符串到所需的长度。然后使用 RAC
宏将映射信号绑定到文本字段。
如您所述,视图模型不应引用视图。但它可以传递 信号 和 return 映射信号。
在视图中:
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 return:@"foo"]
之类的内容传递给视图模型并检查输出是否正确。
我正在采用 MVVM 和 ReactiveCocoa。现在我有一个 UITextField,我需要将它的最大文本长度限制为 100。
在我看来:
- (void)bindViewModel
{
RAC(self.viewModel, text) = self.textField.rac_textSignal;
[RACObserve(self.viewModel, text) subscribeNext:(NSString *text) {
self.textField.text = text;
}];
}
在我的视图模型中
- (id)init
{
[RACObserve(self, text) subscribeNext:^(NSString *x) {
//block 1
if (x.length > maxTextLength) {
x = [x substringToIndex:maxTextLength];
}
}];
}
但这不起作用,block 1
从未被调用。
通过使用 MVVM,我认为文本长度控制逻辑应该放在我的视图模型中,但是实现这个的正确方法是什么?
如this answer中所述:您可以从文本字段中获取rac_textSignal
并使用map
到trim字符串到所需的长度。然后使用 RAC
宏将映射信号绑定到文本字段。
如您所述,视图模型不应引用视图。但它可以传递 信号 和 return 映射信号。
在视图中:
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 return:@"foo"]
之类的内容传递给视图模型并检查输出是否正确。