刚开始学习强大的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); }];
只能监听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/