ReactiveCocoa狀態(tài)推導(dǎo)

2018-08-01 16:10 更新

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

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

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

added_a_button

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

請(qǐng)注意,稍候?qū)⒖吹轿覀內(nèi)绾问褂胋uttons的命令來(lái)更好地約束她的enable屬性。

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

但是,文本的顏色怎么辦?實(shí)際上我們?cè)谶@個(gè)基礎(chǔ)上做一點(diǎn)點(diǎn)重構(gòu)就可以了。

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

很好!看到我們?cè)鯓訌?fù)用validEmailSignal嗎?這在ReactiveCocoa中是非常常見(jiàn)的用法。在viewDidLoad方法之外,我們也不用寫(xiě)任何代碼,這也很常見(jiàn)。

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)