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反映されません。ただし、バックスペース キーを使用してフィールドをリセットするnameIndicatorGreenStar.pngRedStar.png

nameIndicator画像とともにテキストフィールドをリセットするために必要な修正を誰かに提案できますか?

4

1 に答える 1

4

取得するシグナルは-rac_textSignal、UI からの更新のみを反映しており、 のようなプログラムによる変更は反映していません-setText:

簡単で必須の修正は、 の subscribe ブロックに割り当てるだけnameIndicator.imageですresetButton

[[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 に答える