【仿去哪儿登录】UITextField输入时检查输入框是否为空

APP登录时,一般是是等用户输入完账号和密码后才去检查是否为空,而去哪儿登录时,在账号和密码的输入过程中,只要当账号和密码其一为空时,登录按钮立即变成不可用(图1),只有账号和密码均符合要求时,登录按钮才可用(图2)。本文就是来实现这一功能:当登录所需的UITextFiled均不空时登录按钮才有效。


图1-去哪儿APP登录按钮不可用状态



图2-去哪儿APP登录按钮可用状态



要实现这一功能,首先想到的是使用UITextFiledDelegate,要实现哪个方法呢?只要一个方法:

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string

这个方式是在用户将要输入或者删除字符,即 Text将要发生改变时,就会被调用,官方的描述为:

Asks the delegate if the specified text should be changed.
The text field calls this method whenever the user types a new character in the text field or deletes an existing character.

注意这里强调了“将要”,所以不能直接在这个方法内根据UITextField的Text的长度来判断输入框是否为空,因为当输入框为空时,此时用户输入一个字符, UITextField.text.length 还是等于0,当用户再输入一个字符,UITextField.text.length的值才会是1(而此时用户看到的输入字符串长度应该是2),原因是这个前面提到的“将要”, shouldChangeCharactersInRange函数是在用户的输入输入到UITextField之前调用的,所以总是“慢半拍”,好了,朋友喊去打球,就不废话了,直接上示例代码。


先是ViewController.h声明了三个输入框用来输入姓名、电话、车牌和一个确定按钮,并实现UITextFiledDelegate代理

@interface MakeOrderViewController : BaseViewController<UITextFieldDelegate>
@property (weak,nonatomic) IBOutlet UIView *textView;
@property (weak,nonatomic) IBOutlet UITextField *nameText;
@property (weak,nonatomic) IBOutlet UITextField *phoneText;
@property (weak, nonatomic) IBOutlet UITextField *carText;
@property (weak,nonatomic) IBOutlet UIButton *OkBtn;
@end


然后是 ViewController.m文件

@interface MakeOrderViewController ()

@end

@implementation MakeOrderViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    self.nameText.delegate = self;
    self.carText.delegate = self;
    self.phoneText.delegate = self;
    self.OkBtn.enabled = NO;
    self.OkBtn.alpha = 0.5;
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{
    BOOL isOK = YES;//记录用户输入是否合法
    if (textField!=self.nameText&&self.nameText.text.length==0) {
        isOK = false;
    }else if(textField!=self.phoneText&&self.phoneText.text.length==0){
        isOK = false;
    }else if(textField!=self.carText&&self.carText.text.length==0){
        isOK = false;
    }else if(range.location == 0&&[string isEqualToString:@""]){
        isOK = false;
    }
    
    if (isOK) {
        self.OkBtn.alpha = 1;
        self.OkBtn.enabled = YES;
    }else{
        self.OkBtn.alpha = 0.5;
        self.OkBtn.enabled = NO;
    }
    
    return YES;
}

@end


有必要解释下shouldChangeCharactersInRange函数的几个参数

textField  就是当前编辑的UITextFiled range 是一个结构体,包含用户刚刚输入的字符位置(location)和长度(length)

string 就是用户刚刚输入的字符,如果用户刚刚是按了delete键,string为空


上面的函数的前三个判断,是判断非编辑状态下的输入框(就是没有获得焦点的那两个输入框)的内容是否为空, 最后一个判断range.location == 0&&[string isEqualToString:@""],是为了判断在当前输入框中是否是用户输入字符后点击delete键将某个UITextFiled的字符全部删除的操作,是的话要将按钮设置为不可点击


效果:





评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值