首页 > 其他分享 >iOS开发之--为UITextField监听数值变化的三种方法

iOS开发之--为UITextField监听数值变化的三种方法

时间:2023-08-22 11:00:47浏览次数:29  
标签:-- text self iOS value void UITextField textField

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

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

打印如下:

iOS开发之--为UITextField监听数值变化的三种方法_#pragma

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

 

替换方法如下:

1、直接监听 

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

2、NSNotificationCenter 添加监听方法

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

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

#pragma mark - 代理
-(void)addDelegate{
    //实现 UITextFieldDelegate 协议
    self.textField4.delegate = self;
}
#pragma mark  UITextFieldDelegate
- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField{
    return YES;
}// return NO to disallow editing.
- (void)textFieldDidBeginEditing:(UITextField *)textField{
    NSLog(@"textField4 - 开始编辑");
}// became first responder
- (BOOL)textFieldShouldEndEditing:(UITextField *)textField{
    return YES;
}// return YES to allow editing to stop and to resign first responder status. NO to disallow the editing session to end
- (void)textFieldDidEndEditing:(UITextField *)textField{
    NSLog(@"textField4 - 结束编辑");
}// may be called if forced even if shouldEndEditing returns NO (e.g. view removed from window) or endEditing:YES called
- (void)textFieldDidEndEditing:(UITextField *)textField reason:(UITextFieldDidEndEditingReason)reason NS_AVAILABLE_IOS(10_0){

}// if implemented, called in place of textFieldDidEndEditing:

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{
     NSLog(@"textField4 - 正在编辑, 当前输入框内容为: %@",textField.text);
    return YES;
}// return NO to not change text

4、KVO监听数值变化

-(void)addKVO{
    [self.textField3 addObserver:self forKeyPath:@"text" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:nil];
    self.textField3.text = @"123";
}
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context{
    if ([keyPath isEqualToString:@"text"] && object == self.textField3) {
        NSLog(@"textField3 - 输入框内容改变,当前内容为: %@",self.textField3.text);
    }else{
        [super observeValueForKeyPath:keyPath ofObject:object change:change context:context];
    }
}
-(void)dealloc{
    [self.textField3 removeObserver:self forKeyPath:@"text" context:nil];
}

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


作者:稻草人11223

标签:--,text,self,iOS,value,void,UITextField,textField
From: https://blog.51cto.com/u_13188203/7187017

相关文章

  • 我的第一个electron
    安装步骤参考:https://www.electronjs.org/zh/docs/latest/tutorial/quick-start 拉取镜像关于拉取  electronmodule镜像遇到的问题失败的解决方案(对于别人来说可能好使)https://blog.csdn.net/Akua_/article/details/132102805我在我的  C:\Windows\System......
  • 修改MySQL字符集
     修改MySQL字符集1. net start mysql2. mysql -u用户名 -p密码3. SHOW VARIABLES LIKE 'character_set_%'; 在mysql下找到my.ini文件[mysqld]character-set-server=utf8 [client]default-character-set=utf8 [mysql]default-character-set=utf8......
  • bfs 双向宽搜
     1、迷宫问题,找最短路:可以同时从起点和终点进行bfs,两个方向搜索的新节点分别存在不同的队列中的,若新节点在对面的状态集合中出现过,说明相遇了。2、很多bfs问题,都可以用双向宽搜,提高效率。3、分油问题,能不能用双向宽搜呢?3个无刻度的油瓶的容量是1073,其中分别有油10,0,0......
  • 关于Serverless服务的几点建议
    通过迅速灵活以及容量巨大的弹性伸缩,无服务器架构能很好地解决关键功能的性能瓶颈,但它并不是完美的:不仅需要修改设计去适应它,对熟悉的编程模型进行调整,还要解决诸如规划预算、安全等等问题。但总的来说,它为云上的应用提供了另一种选择——并且具有难以抵挡的诱惑:极大地简化应用......
  • 粗粒度可重构架构
    CGRA介绍粗粒度可重构架构(CGRA)是一种替代硬件平台,相比FPGA细粒度的可重构架构,由于CGRA内部的IS(ALU)模块已经构建完成(IssueSlot+RegistryFile+MUX构成的组合结构),且CGRA的interconnect也要比FPGA更简单、规模更小,其延时和性能要显著好于在门级上进行互连形成组合计算逻辑的FPGA......
  • 用 Dijkstra 算法解决最短路问题
    话不多说,先看图1.1朴素版的Dijkstra算法一般用到这个情况稠密图,也就是节点的个数比边的个数少。(稠密图用邻接矩阵存储)#include<cstring>#include<iostream>#include<algorithm>usingnamespacestd;constintN=510;intn,m;intg[N][N];//稠密图用邻接矩阵,g......
  • java 读取各种类型的文件 (一)
    Java可以用不同的库来读取各种格式的文档。下面是一些常见的文档格式以及相应的Java库:CSV文件:使用ApacheCommonsCSV库来读取和写入CSV文件。该库提供了一个简单易用的API。Excel文件(xls和xlsx):可以使用ApachePOI库来读取和写入Excel文件。该库支持旧版的xls文件和新版的xl......
  • 【校招VIP】java语言考点之垃圾回收算法
    考点介绍:垃圾回收算法是必考题。GC中的垃圾指的是存在于内存中的、不会再被使用的对象。而垃圾回收就是把那些不再被使用的对象进行清除,收回占用的内存空间......一、考点题目1、java中如何判断对象是否是垃圾?解答:引用计数:在对象中添加一个引用计数器,如果被引用计数器加1,引用......
  • pytest 多参数传递时的坑 参数数组格式 :[(参数1,参数2)(参数1,参数2)] ;一个参数传递时
    一个参数传递时结果:(参数1) 两个参数传递时:参数1参数2 ......
  • 【分享】字符串常见函数学习笔记
    字符串常见函数学习笔记 1:查找函数:find()//返回值string::nposstrings="goodgoodstudy,daydayup";intpos1=s.find("good");//查找子串"good"intpos2=s.find("good",4);//从下标4开始,查找子串"good"cout<<pos1<......