ios - RACObserve(), RAC() - 如何根据 NSString 设置 BOOL 值

标签 ios reactive-cocoa

作为 ReactiveCocoa 的新手,我希望得到一些建议:

我正在尝试创建一个包含多个从 XML 文件解析的 Field 对象的动态表单。每个 Field 都可以有多个验证规则,这些规则将针对 Field 的 NSString *value 参数运行。

对于问题的 RAC 部分-

在每个 Field 对象中,我想将 BOOL completed 绑定(bind)到一个信号,该信号根据一组规则检查 Field 的 *value 参数。到目前为止,我的想法是:

@implementation Field

self = [super init];
if (self) {

    RAC(self, completed) = [RACObserve(self, value) filter:^BOOL(NSString *fieldValue) {
        NSLog(@"%s::self.completed = %d\n", sel_getName(_cmd), self.completed);  // trying to watch the values here, with no luck 
        NSLog(@"%s::fieldValue = %@\n", sel_getName(_cmd), fieldValue);  // same here, I'd like to be able to view the `*value` here but so far no luck

        return [self validateCurrentValue]; // currently this method just checks value.length > 5 
    }];
}
return self;

*value 参数已经绑定(bind)到我的 View 模型(成功),并且每次文本字段更改时它都会更新。

我正在寻找的是一个基本示例或最佳实践,上面的代码在运行时会崩溃,所以我知道我缺少一些基本的东西。

谢谢大家

最佳答案

-filter: 只是将来自 RACObserve(self, value) 的值原封不动地传递过去,但前提是该 block 返回 YES。所以这意味着您正在尝试将 completed 设置为 value 类型的值。 That's Probably Bad®。

但好消息是你真的很接近!

您想要转换而不是过滤。您想要获取每个 value 并将其映射到其他事物。即该值是否通过验证。为此,我们使用 -map::

RAC(self, completed) = [RACObserve(self, value) map:^(NSString *fieldValue) {
    return @([self validateCurrentValue]);    
}];

关于ios - RACObserve(), RAC() - 如何根据 NSString 设置 BOOL 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23696275/

相关文章:

validation - ReactiveCocoa - 观察 isFirstResponder 属性和 UITextField 并将clearsOnBeginEditing 设置为 YES

swift - ReactiveCocoa - 具有一般错误处理功能的信号生成器序列

swift - 如何使用 RACScheduler 创建循环 RACSignal

ios - 根据参数不同的 Storyboard入口点

ios - 当我更新 Kingfisher 时,本地 gif 没有显示

ios - 用键B的字典中相同NSarray中的字符串替换键A中的字典NSarray中的NSString部分

reactive-cocoa - 具有源自另一个信号的副作用的信号、多个订阅者

ios - 快速使用 ReactiveCocoa

iOS 5 - 从一个 TableViewController 到另一个 TableViewController

ios - 我应该只使用 canDisplayBannerAds。没有广告横幅 View ?