0

我已经UITextFieldUIImageView并且UIButton在我的UIView.

我有一个在订阅时RACSignal使用的打印文本框字段值。NSLog此外,它还UIImageView充当错误指示器。

代码片段如下所示:

[username.rac_textSignal subscribeNext:^(NSString *value) {
    NSLog(@"-Text field(username) has been updated: %@", value);
}];

RAC(nameIndicator,image) = [username.rac_textSignal map:^id(NSString *value) {
                                NSLog(@"Text field(username) has been updated: %@", value);
                                if([value length]) return [UIImage imageNamed:@"GreenStar"];
                                else return [UIImage imageNamed:@"RedStar"];
                            }];

[[resetButton rac_signalForControlEvents:UIControlEventTouchUpInside]
 subscribeNext:^(id x) {
             [username setText:@""];
 }];

每当我使用重置按钮重置字段时,文本字段都会被清除,但nameIndicator不会反映相应的更改。但是,如果我使用退格键重置该字段,nameIndicator则会从GreenStar.png变为RedStar.png

谁能建议我重置文本字段和nameIndicator图像所需的更正?

4

1 回答 1

4

您从中获得的信号-rac_textSignal仅反映来自 UI 的更新,而不是像-setText:.

简单的、命令式的解决方法是只分配nameIndicator.imageinresetButton的 subscribe 块。

[[resetButton
    rac_signalForControlEvents:UIControlEventTouchUpInside]
    subscribeNext:^(id x) {
        username.text = @"";
        nameIndicator.image = [UIImage imageNamed:@"RedStar"];
    }];

或者,更实用的解决方案是创建一个信号,该信号代表对文本字段的直接更改和清除文本字段的按钮点击。后一个信号将在点击重置按钮时发送空字符串,同时也清除文本字段。

RACSignal *resetUsernameSignal = [[[resetButton
    rac_signalForControlEvents:UIControlEventTouchUpInside]
    mapReplace:@""]
    doNext:^(NSString *text) {
        username.text = text;
    }];

RAC(nameIndicator, image) = [[RACSignal
    merge:@[
        username.rac_textSignal,
        resetUsernameSignal
    ]]
    map:^(NSString *text) {
        NSLog(@"Text field(username) has been updated: %@", value);
        if([value length]) return [UIImage imageNamed:@"GreenStar"];
        else return [UIImage imageNamed:@"RedStar"];
    }]
于 2013-12-16T06:09:55.513 回答