带有ReactiveCocoa的MVVM:限制视图模型中UITextField的文本长度

时间:2015-07-05 07:30:32

标签: ios objective-c mvvm reactive-cocoa

我采用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,我相信文本长度控制逻辑应该放在我的视图模型中,但是实现这个的正确方法是什么?

1 个答案:

答案 0 :(得分:3)

this answer所述:您可以从文本字段中取RAC并使用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"]

在您的视图模型中:

jquery-ui

这也使文本控制逻辑易于测试 - 在单元测试中,您可以将bind之类的内容传递给视图模型并检查输出是否正确。