ReactiveCocoa 对UITextField的操作

前端之家收集整理的这篇文章主要介绍了ReactiveCocoa 对UITextField的操作前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

刚开始学习强大的ReativeCocoa库,对它的理解还是很浅,都是摸着石头过河。刚想结合项目,就碰到了一个问题。

ReactiveCocoa对textfield的操作。

根据网上的一些例子,学着去操作一次,

    [RACObserve(self.nameText,text) subscribeNext: ^(NSString *newText){
        NSLog(@"nameText:%@",newText);
    }];
    [RACObserve(self.pwdText,text) subscribeNext: ^(NSString *newText){
        NSLog(@"pwdText:%@",newText);
    }];

在虚拟机中,使用虚拟键盘敲入数据,结果只有在加载textfield时有log输出,而输入的数据完全没响应。于是又换了一种方式:

// TODO:using rac_textSignal
    [self.nameText.rac_textSignal subscribeNext:^(NSString *newText) {
        NSLog(@"nameText:%@",newText);
    }];
    [self.pwdText.rac_textSignal subscribeNext:^(NSString *newText){
        NSLog(@"pwdText:%@",newText);
    }];


使用RAC给我们已经建立的singal,却达到了我要的效果。为什么呢?同样是去观察textfield的变化。查证后发现,使用RACObserve text的方法

只能监听self.nametext.text = @"";这样的赋值操作。而虚拟键盘的输入,是使用了UITextFieldDelegate的方式完成操作的。

两种方法,对比起来,当然是第二种方便好用。推荐第二种,如果要第一种的方式,还得研究研究如何替代UITextFieldDelegate 实现监听。

ReactiveCocoa 在对textfield扩展时就已经这么做到了。

- (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]];
}

现在终于明白了,以后还是多看看源码。


附上使用ReactiveCocoa代替Delegate的一些做法 mark

http://spin.atomicobject.com/2014/02/03/objective-c-delegate-pattern/

猜你在找的React相关文章