加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ReactiveCocoa 对UITextField的操作

发布时间:2020-12-15 04:55:30 所属栏目:百科 来源:网络整理
导读:刚开始学习强大的ReativeCocoa库,对它的理解还是很浅,都是摸着石头过河。刚想结合项目,就碰到了一个问题。 ReactiveCocoa对textfield的操作。 根据网上的一些例子,学着去操作一次, [RACObserve(self.nameText,text) subscribeNext: ^(NSString *newText)

刚开始学习强大的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/

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读