ReactiveCocoa狀態(tài)推導

2018-08-01 16:10 更新

狀態(tài)推導是ReactiveCocoa的另一個核心組件。這里不是指類的某個屬性(類似于設置一個新的值就代表狀態(tài)發(fā)生了改變),這里我們指的是把屬性抽象為流。我們來為上一節(jié)的例子增加狀態(tài)推導。

假設我們的視圖是用來創(chuàng)建賬戶的,我們只允許包含有'@'字符的Email地址,當且僅當,輸入的用戶名有效時使按鍵可用,同時我們也希望通過TextField中Text的顏色給用戶提供反饋。

  • 首先我們使用IBOutlet在視圖上增加一個按鍵‘button’.

added_a_button

  • 其次我們將button的enable屬性與我們創(chuàng)建的信號綁定。
RAC(self.button, enabled) = [self.textField.rac_textSignal map:^id (NSString *value){
    return @([value rangeOfString:@"@"].location != NSNotfound);
}];

請注意,稍候將看到我們如何使用buttons的命令來更好地約束她的enable屬性。

RAC()宏需要兩個參數:‘對象’以及這個對象的某個屬性的'keyPath'。然后將表達式右邊的值和'keyPath'做一個單向的綁定,這個值必須是NSObject類型,所以我們會把boolean量封裝成NSNumber。

但是,文本的顏色怎么辦?實際上我們在這個基礎上做一點點重構就可以了。

RACSignal * validEmailSignal = [self.textField.rac_textSignal map:^id (NSString *value){
    return @([value rangeOfString:@"@"].location != NSNotFound);
}];

RAC(self.button, enabled) = validEmailSignal;

RAC(self.textField, textColor) = [validEmailSignal map: ^id (id value){
    if([value boolValue]){
        return [UIColor greenColor];
    }else{
        return [UIColor redColor];
    }
}];

invalid_email_address

valid_email_address

很好!看到我們怎樣復用validEmailSignal嗎?這在ReactiveCocoa中是非常常見的用法。在viewDidLoad方法之外,我們也不用寫任何代碼,這也很常見。

以上內容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號