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

标签 validation uitextfield reactive-cocoa

我是 ReactiveCocoa 的新手,但我认为这是降低代码复杂性的非常好的和出色的技术。我刚刚开始体验该框架,目前对我来说并不是一切都清楚,所以如果我的问题可以通过某种明显的方式解决,请原谅。

在我的应用程序中,我有一个具有简单表单的登录 View Controller ,其中包含两个文本字段(用户名和密码)和一个按钮。如果两个文本字段中的任何一个为空,我希望禁用该按钮。所以,我写了这段代码:

RAC(self.loginButton, enabled) = 
[RACSignal combineLatest:@[self.userTextField.rac_textSignal,
                           self.passwordTextField.rac_textSignal]
                  reduce:^(NSString *username,
                           NSString *password) {
                      BOOL valid = (username.length > 0 && password.length > 0);
                      return @(valid);
                  }];

这非常简单并且有效。问题是我的文本字段之一(密码字段)的 secureTextEntry 和clearsOnBeginEditing 属性设置为 YES。我将尝试解释使用此配置时遇到的不良行为:

假设用户名和密码字段都不为空。在这种情况下,该按钮被启用。当用户点击密码字段时,它成为第一响应者(键盘出现,用户可以输入密码),但由于该字段的 clearsOnBeginEditing 设置为 YES,之前输入的密码将从文本中清除 field 。这样密码字段现在为空。问题是信号未发送,因此尽管密码字段为空,但按钮仍保持启用状态。

我解决这个问题的第一个想法(嗯,更像是解决方案)是除了观察文本更改之外,还观察密码字段上的 isFirstResponder 属性。这样,当密码字段成为第一响应者时,将调用检查是否应启用按钮的 block 。我不知道这个解决方案是否有效,因为我不知道如何使用 ReactiveCocoa 来实现它。我一直在寻找为 isFirstResponder 属性更改创建信号,但没有运气。这可能不是解决此问题的最佳方法,但目前我没有任何想法。

那么,问题是:如何用ReactiveCocoa观察isFirstResponder属性?

还有更一般的问题:当 clearsOnBeginEditing 设置为 YES 时如何观察文本字段的文本变化?

更新:

我发现我可以为 UIControlEventEditingDidBegin 事件创建信号,该信号应该让我替代观察 isFirstResponder 属性更改:

[self.passwordTextField rac_signalForControlEvents:UIControlEventEditingDidBegin]

不幸的是,这并不能解决问题。现在我知道该字段在成为第一响应者后被清除,并且在成为第一响应者后自动清除字段不会发送文本更改信号。这样,当执行验证 block 时,它仍然认为密码字段不为空,并且尽管密码字段已被清除且为空,但按钮仍保持启用状态。

最佳答案

不幸的是,-rac_textSignal 仅监听 UIControlEventEditingChanged。如果添加了 UIControlEventEditingDidBegin,那么一切就都准备好了。

我想你可以将其修补到其中并提交拉取请求?

- (RACSignal *)rac_textSignal {
    @weakify(self);
    return [[[[[RACSignal
        defer:^{
            @strongify(self);
            return [RACSignal return:self];
        }]
        concat:[self rac_signalForControlEvents:UIControlEventEditingChanged|UIControlEventEditingDidBegin]]
        map:^(UITextField *x) {
            return x.text;
        }]
        takeUntil:self.rac_willDeallocSignal]
        setNameWithFormat:@"%@ -rac_textSignal", [self rac_description]];
}

关于validation - ReactiveCocoa - 观察 isFirstResponder 属性和 UITextField 并将clearsOnBeginEditing 设置为 YES,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21616418/

相关文章:

ios - RACObserve 不工作

swift - 一般在 SignalProducer 中注入(inject)副作用

mysql - 验证另一个表中数据的唯一性

validation - 如何在 Symfony2 回调验证错误消息上启用翻译?

objective-c - 按字母顺序OBJ-C识别字符

ios - 如何将 UITableViewCell 中 textField 的值获取到 textFieldDelegate 方法 shouldChangeCharactersIn 中?

objective-c - iPhone 号码文本到完整的货币等式

jquery - 如何使用 Codeigniter 和 Jquery 验证多维数组

iphone - textFieldDidEndEditing 替代方案

ios - RACS信号组合