zoukankan      html  css  js  c++  java
  • ios 监听TextField中内容变化

    本篇文章只为帮助跟多的人。适合初学者。
    在这里我介绍3种监听UITextField的方法。并在最后写了一个小的demo 提供参考。
    -------请不要纠结小编的命名方式规不规范,一切只为共同学习,共同进步。
     
    @property (weak, nonatomic) IBOutlet UITextField *UserID;
    @property (weak, nonatomic) IBOutlet UITextField *Password;
    @property (weak, nonatomic) IBOutlet UIButton *LoginBut;
     
     监听文本框中的内容的几种方式:(用于登录账号-用于搜索)
     1.代理 (只能监听设置了代理的文本框没有设置代理的文本框不能进行监听)                                                                                                              
    <UITextFieldDelegate>
     
     _UserID.delegate=self(设置代理)
     
     
    //是否可以编辑yes可以 no不可以
    - (BOOL)textFieldShouldBeginEditing:(UITextField *)textField{
        return YES;
    }
    //开始编辑的时候调用
    - (void)textFieldDidBeginEditing:(UITextField *)textField{
        NSLog(@"开始编辑");
    }
     
    //是否允许结束编辑(当用户结束一个文本框的时候,首先会调用这个)
    //如果是NO 意思就是,这个文本框回一直处于编辑状态(也叫第一响应者),就算你再点击其他文本框,是没有任何效果的
    - (BOOL)textFieldShouldEndEditing:(UITextField *)textField{
        return YES;
    }
    //结束编辑的时候调用
    - (void)textFieldDidEndEditing:(UITextField *)textField{
        NSLog(@"结束编辑");
    }
     
    //是否允许用户输入文件
    //用户每次输入一个字符的时候就会调用一次。然后判断是非显示在文本框里
    - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{
       //打印
        NSString *text=[NSString stringWithFormat:@"%@%@",textField.text,string];
        NSLog(@"------%@",text);
        return YES;
    }
    //是否允许清除当前文本框中所输入的内容
    - (BOOL)textFieldShouldClear:(UITextField *)textField{
        return YES;
    }
     
     2.通知  (可以监听所有的文本框)                                                                                                             
     
     /*
         UITextFieldTextDidChangeNotification //文本框改变的通知
         object:_UserID 表示_UserID 这一个文本框
         object:nil     表示 所有的文本框
         */
    [NSNotificationCenter defaultCenter]addObserver:self selector:@selector(textChange) name:UITextFieldTextDidChangeNotification object:nil];
     
    -(void)textChange{
        NSLog(@“-----Change-----");
    }
     
    //当前对像要销毁的时候,创建的通知要进行移除:(否则可能报错,坏内存访问)
    -(void)dealloc{
        [[NSNotificationCenter defaultCenter] removeObserver:self];
    }
     
     3.监听者(addTarget)()                                                                                                             
     
    /*
         Events(事件):当我产生什么事件的时候会掉用这个方法
         UIControlEventEditingChanged : 当文本框进行编辑
         */
     
        [_UserID addTarget:self action:@selector(textChange) forControlEvents:UIControlEventEditingChanged];
       
        [_Password addTarget:self action:@selector(textChange) forControlEvents:UIControlEventEditingChanged];
      
    }
    //我把2个文本框的监听触发方法都设置为textChange 目的是判断登录按钮是否可以点击
    //只有2个文本框都有值才可以进行点击(这里根据自己的需要)
    -(void)textChange{
        if(_UserID.text.length && _Password.text.length){
            _LoginBut.enabled=YES;
        }else{
         _LoginBut.enabled=NO;
        }
    //这个判断可以优化为一行:
        _LoginBut.enabled=_UserID.text.length && _Password.text.length;
     
        NSLog(@"gaibia-----");
    }
     
     

    demo
    通知与代理一起使用:
    如果有5个文本框或者跟多同时监听,我想直接打印出处于编辑的那个文本框(第一响应者)是哪一个,内容是什么:
    代码:
     
     
     
     
    这里不需要拖线(你的storyboard 要与你的viewcontroller相关联)
     
    #import "ViewController.h"
     
    @interface ViewController () <UITextFieldDelegate>
     
    //@property (nonatomic, strong) NSArray *TextFieldAll;//存储所有的textField
     
    @property (nonatomic, strong) UITextField *newtext;//获取处于编辑状态的UITextField
    @end
     
    @implementation ViewController
     
     
     
     
    - (void)viewDidLoad {
        //创建一个数组存储textfield
        NSMutableArray *fieldsM = [NSMutableArray array];
       
        //没有拖线
        //这句代码是获取view上的所有控件,包括label,textfield;
        NSArray *childArray=self.view.subviews;
     
        //循环遍历所有的控件
        for (UIView *child in childArray) {
           
            //找出所有的TextFieldAll
            if([child isKindOfClass:[UITextField class]]){
                //类型转换
                UITextField *textField=(UITextField *)child;
     
                //设置代理
                textField.delegate=self;
               
              //  [fieldsM addObject:textField];
     
            }
        }
     //   _TextFieldAll=fieldsM;
       
        //创建通知:监听每一个TextField
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textChange) name:UITextFieldTextDidChangeNotification object:nil];
    }
     
    -(void)textChange{
        //打印处于编辑状态的TextField 和 tag
        NSLog(@"%@-%ld",_newtext.text,(long)_newtext.tag);
     
    }
     
    - (void)textFieldDidBeginEditing:(UITextField *)textField{
       
        _newtext=[[UITextField alloc]init];
        _newtext=textField;
       
    }
     
    @end
     
    最后运行效果 和 打印——————————————————
     
  • 相关阅读:
    依赖注入
    Java实现一个字符串的反转
    LRU缓存介绍与实现 (Java)
    Java中HashMap遍历的两种方法(转)
    java中判断字符串是否为只包含数字
    LeakCanary 的使用遇到的弯路
    转: BAT等研发团队的技术博客
    转: android 内存检测工具 LeakCanary 说明
    转:安桌开发开源库的推荐1
    转: 技术牛人博客
  • 原文地址:https://www.cnblogs.com/312294025myj/p/7308109.html
Copyright © 2011-2022 走看看