项目中有个验证码输入直接验证跳转页面,用的RAC来监听textfield的输入值,如下:

  1. @weakify(self);
  2. [self.codeView.textField.rac_textSignal subscribeNext:^(NSString *value) {
  3. @strongify(self);
  4.  
  5. self.value = value;
  6. //也可以直接在这里写想要执行的操作
  7. }];
  8.  
  9. //当self.value的值变化时调用Block,这是用KVO的机制,RAC封装了KVO
  10. [RACObserve(self, self.value) subscribeNext:^(NSString *value) {
  11.  
  12. NSLog(@"--%@",value);
  13.  
  14. if (value.length == ) {
  15. [self.navigationController pushViewController:[SetPsdViewController new] animated:YES];
  16. return;
  17. }
  18. }];

打印如下:

明显走了两次,还没找到原因,有幸看到的大神可以帮忙解惑下!

替换方法如下:

1、直接监听

  1. #pragma mark - 直接添加监听方法
  2. -(void)addTargetMethod{
  3. [self.textField1 addTarget:self action:@selector(textField1TextChange:) forControlEvents:UIControlEventEditingChanged];
  4. }
  5. -(void)textField1TextChange:(UITextField *)textField{
  6. NSLog(@"textField1 - 输入框内容改变,当前内容为: %@",textField.text);
  7. }

2、NSNotificationCenter 添加监听方法

  1. #pragma mark - NSNotificationCenter 添加监听方法
  2. -(void)addNSNotificationCenter{
  3. [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textField2TextChange:) name:UITextFieldTextDidChangeNotification object:self.textField2];
  4. }
  5. -(void)textField2TextChange:(NSNotification *)noti{
  6. UITextField *currentTextField = (UITextField *)noti.object;
  7. NSLog(@"textField2 - 输入框内容改变,当前内容为: %@",currentTextField.text);
  8. }
  9. -(void)dealloc{
  10. [[NSNotificationCenter defaultCenter] removeObserver:self];
  11. }

3、代理方法--这种方法比较常用,但是代码写的比较多,如果TF多的话,看着可乱

  1. #pragma mark - 代理
  2. -(void)addDelegate{
  3. //实现 UITextFieldDelegate 协议
  4. self.textField4.delegate = self;
  5. }
  6. #pragma mark UITextFieldDelegate
  7. - (BOOL)textFieldShouldBeginEditing:(UITextField *)textField{
  8. return YES;
  9. }// return NO to disallow editing.
  10. - (void)textFieldDidBeginEditing:(UITextField *)textField{
  11. NSLog(@"textField4 - 开始编辑");
  12. }// became first responder
  13. - (BOOL)textFieldShouldEndEditing:(UITextField *)textField{
  14. return YES;
  15. }// return YES to allow editing to stop and to resign first responder status. NO to disallow the editing session to end
  16. - (void)textFieldDidEndEditing:(UITextField *)textField{
  17. NSLog(@"textField4 - 结束编辑");
  18. }// may be called if forced even if shouldEndEditing returns NO (e.g. view removed from window) or endEditing:YES called
  19. - (void)textFieldDidEndEditing:(UITextField *)textField reason:(UITextFieldDidEndEditingReason)reason NS_AVAILABLE_IOS(10_0){
  20.  
  21. }// if implemented, called in place of textFieldDidEndEditing:
  22.  
  23. - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{
  24. NSLog(@"textField4 - 正在编辑, 当前输入框内容为: %@",textField.text);
  25. return YES;
  26. }// return NO to not change text

4、KVO监听数值变化

  1. -(void)addKVO{
  2. [self.textField3 addObserver:self forKeyPath:@"text" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:nil];
  3. self.textField3.text = @"";
  4. }
  5. -(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context{
  6. if ([keyPath isEqualToString:@"text"] && object == self.textField3) {
  7. NSLog(@"textField3 - 输入框内容改变,当前内容为: %@",self.textField3.text);
  8. }else{
  9. [super observeValueForKeyPath:keyPath ofObject:object change:change context:context];
  10. }
  11. }
  12. -(void)dealloc{
  13. [self.textField3 removeObserver:self forKeyPath:@"text" context:nil];
  14. }

上面这几种方法,亲测有效,仅做记录!

参考:https://blog.csdn.net/qxuewei/article/details/50727617

iOS开发之--为UITextField监听数值变化的三种方法的更多相关文章

  1. ios开发之--通过通知监听textfield的输入状态,判断按钮的状态

    第一步: _rightBtn = [UIButton buttonWithType:UIButtonTypeCustom]; _rightBtn.frame = CGRectMake(kWidth - ...

  2. ios开发之--键盘的监听

    监听键盘的弹出,让整个页面向上移动,比较简单,仅做记录使用: 代码如下: // 监听键盘 [[NSNotificationCenter defaultCenter] addObserver:self ...

  3. $scope.$watch()——监听数据变化

    $scope.$watch(watchFn, watchAction, [deepWatch]):监听数据变化,三个参数 --watchFn:监听的对象,一个带有Angular 表达式或者函数的字符串 ...

  4. vue.js之过滤器,自定义指令,自定义键盘信息以及监听数据变化

    一.监听数据变化 1.监听数据变化有两种,深度和浅度,形式如下: vm.$watch(name,fnCb); //浅度 vm.$watch(name,fnCb,{deep:true}); //深度监视 ...

  5. ios开发UI篇—UITextfield

    概述 UITextField在界面中显示可编辑文本区域的对象. 您可以使用文本字段来使用屏幕键盘从用户收集基于文本的输入.键盘可以配置许多不同类型的输入,如纯文本,电子邮件,数字等等.文本字段使用目标 ...

  6. 对于单页应用中如何监听 URL 变化的思考

    周末开发了一个在 GitHub 中给 repo 增加自定义备注的 chrome 扩展. 开发这个扩展的原因是我在 GitHub 中所 star 的项目实在太多了(截止目前 671 个),有的项目过个几 ...

  7. UI设计篇·入门篇·简单动画的实现,透明动画/旋转动画/移动动画/缩放动画,混合动画效果的实现,为动画设置监听事件,自定义动画的方法

    基本的动画构成共有四种:透明动画/旋转动画/移动动画/缩放动画. 配置动画的方式有两种,一种是直接使用代码来配置动画效果,另一种是使用xml文档配置动画效果 相比而言,用xml文档写出来的动画效果,写 ...

  8. node.js监听文件变化

    前言 随着前端技术的飞速发展,前端开发也从原始的刀耕火种,向着工程化效率化的方向发展.在各种开发框架之外,打包编译等技术也是层出不穷,开发体验也是越来越好.例如HMR,让我们的更新可以即时可见,告别了 ...

  9. Android 5.0 以上监听网络变化

    大家好,大概有一个多月没有更新博客了,我是干什么去了呢?很明显,程序员当然要加班……这一次跟大家分享一下新项目的一些心得. 监听网络变化在开发中是经常用到的,例如我们断网有一些友好的提示,或者根据不同 ...

随机推荐

  1. 微服务:Eureka+Zuul+Ribbon+Feign+Hystrix构建微服务架构

    原文地址:http://blog.csdn.net/qq_18675693/article/details/53282031 本案例将打架一个微服务框架,参考来源官方参考文档 微服务:是什么?网上有一 ...

  2. openssl rsa加密,解密以及X509证书的使用

    Openssl的相关使用 生成证书 生成证书见:使用 openssl 生成证书 代码实现 Cert.h #ifndef _CERT_H #define _CERT_H ///header files ...

  3. appium---adb logcat 命令详解

    我们在做app测试的过程中,肯定会遇到需要抓取日志问题,这几天安静也遇到了此问题,后台日志生成的太多了,保存本地了吧,设备多没有这么USB,通过wifi连接又太麻烦,你说这怎么是好?不要着急,我们往下 ...

  4. JAVA框架中XML文件

    其实在JAVA开发中servlet配置,映射注入配置等等都可以用xml来配置 在此处的department是实体类的名字,而不是对应的数据库表的名字 数据库表的字段名=#{实体类属性名} 逆向工程生成 ...

  5. 2. Vue - 初始

    一.vue简单介绍 1. vue定义 ​ vue是一套用于构建用户界面的渐进式框架.vue被设计为可自底向上逐层应用,vue的核心只关注视图层:vue的特点是数据驱动视图,可直接修改数据,不用再手动编 ...

  6. word最近文档清除

  7. (day51)三、ORM、路由层、版本差异、流程图

    目录 一.ORM关系建立 (一)ForeignKey(一对多) (二)ManyToManyField(多对多) (三)OneToOneField(一对一) 二.django请求生命周期流程图 三.ur ...

  8. Django cache (缓存)

    五种配置 1.开发调试 # 此为开始调试用,实际内部不做任何操作 # 配置: CACHES = { 'default': { 'BACKEND': 'django.core.cache.backend ...

  9. python3.8.0 Django 开发后端接口api 部署到 Linux Centos7上

    经历了两天的时候终于把本地使用python3 django开发的接口API部署到服务器上了,还是记录一下,以免之后忘记,哈哈 注意一点,就是,centos7是基于python2的,我这边默认的是pyt ...

  10. ant design pro解决初始加载,有顺序的请求/请求顺序报错问题/登录后再加载其他数据/异步的顺序问题/偷跑

    方法是:如在Authorized.jsx中解决,当未登录成功(包括登录失败和登录验证中),就显示loading,否则继续 加载渲染children 一个三目运算或者if分支就可以解决,但是要写到最先加 ...