实现几个连续输入的textfield

本文详细介绍了如何实现连续输入和删除的文本框功能,并通过代码实例展示了过滤非法字符、统一界面布局以及自动跳转到下一个文本框的操作。

如图所示,需要实现连续输入和删除的textfield
代码如下:
首先定义一个宏来实现过滤非法字符串,让输入的字符都是我定义的里面的字符。

#define kInputNumbers  @"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\n"

下面是定义的4个textfield
@property (retain, nonatomic) IBOutlet JDTextField *textField1;
@property (retain, nonatomic) IBOutlet JDTextField *textField2;
@property (retain, nonatomic) IBOutlet JDTextField *textField3;
@property (retain, nonatomic) IBOutlet JDTextField *textField4;
因为并没有直接可以调用的方法,所以要自己加上观察
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textFieldTextDidChange:) name:UITextFieldTextDidChangeNotification object:nil];
/**
 * 
为了统一界面,在第一个field之前加上@“ ”
 *
 * 
@param textField
 */

- (
void) textFieldDidBeginEditing:(UITextField *)textField{
   
if (textField == _textField1 && !_isDelete) {
        textField.
text = @" ";
    }
}

/**
 * 
对应的field改变之前调用这个方法,在这里面来控制从前面格子往后跳转
 *
 * 
@param textField textField
 * 
@param range     传入的是改变之前光标所在的位置和长度,如果是删除的话是改变后光标的位置,长度为-1
 * 
@param string    改变的字符
 *
 * 
@return YES的时候确认改变,NO的时候抛弃改变(可以用来过滤字符)
 */

- (
BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{
   
//过滤非法字符
   
NSCharacterSet *cs = [[NSCharacterSet characterSetWithCharactersInString:kInputNumbers] invertedSet];
   
NSString *filtered = [[string componentsSeparatedByCharactersInSet:cs] componentsJoinedByString:@""];
   
BOOL basicTest = [string isEqualToString:filtered];
   
if (!basicTest) {
       
return NO;
    }
   
//确定是否是删除键
   
_isDelete = string.length <= 0 ? YES : NO;
   
if (textField == _textField1) {
       
//这个方法确保手动点击某个textfield时可以实现跳到下一个
       
if (range.location == 5) {
            [textField
resignFirstResponder];
           
_textField2.enabled = YES;
            [
_textField2 becomeFirstResponder];
            textField.
enabled = NO;
           
return YES;
        }
       
if (range.location == 0 && _isDelete)
        {
           
return NO;
        }
       
    }
   
else if (textField == _textField2) {
       
if (range.location == 5) {
            [textField
resignFirstResponder];
           
_textField3.enabled = YES;
            [
_textField3 becomeFirstResponder];
            textField.
enabled = NO;
           
return YES;
        }
       
if (range.location == 0 && _isDelete){
            [textField
resignFirstResponder];
           
_textField1.enabled = YES;
            [
_textField1 becomeFirstResponder];
            textField.
enabled = NO;
           
return YES;
        }
    }
   
else if (textField == _textField3) {
       
if (range.location == 5) {
            [textField
resignFirstResponder];
           
_textField4.enabled = YES;
            [
_textField4 becomeFirstResponder];
            textField.
enabled = NO;
           
return YES;
        }
       
if (range.location == 0 && _isDelete){
            [textField
resignFirstResponder];
           
_textField2.enabled = YES;
            [
_textField2 becomeFirstResponder];
            textField.
enabled = NO;
           
return YES;
        }
    }
   
else{
       
if (range.location == 0 && _isDelete){
            [textField
resignFirstResponder];
           
_textField3.enabled = YES;
            [
_textField3 becomeFirstResponder];
            textField.
enabled = NO;
           
return YES;
        }
       
return range.location <= 4  ;
    }
   
return YES;
}

/**
 * 
观察textfield改变之后的属性时调用这个方法,在这个方法里面控制往前面的格子里跳转(因为光标在第一个的时候没有回调方法,所以要在每个之前加上@“ ”
 *
 * 
@param notification 传入观察的对象
 */

- (
void)textFieldTextDidChange:(NSNotification *)notification
{
   
self.moneyLabel.hidden = YES;
   
self.checkLeftBtn.enabled = NO;
   
self.saveAndUseBtn.enabled = NO;
   
UITextField *textField = (UITextField *)[notification object];
   
if (!_isDelete) {
       
if (textField == _textField1 ) {
           
if (textField.text.length >= 5) {
               
_textField2.enabled = YES;
                [textField
resignFirstResponder];
                [
_textField2 becomeFirstResponder];
               
_textField2.text = @" ";
                textField.
enabled = NO;
            }
        }
else if(textField == _textField2 ){
           
if (textField.text.length >= 5) {
               
_textField3.enabled = YES;
                [textField
resignFirstResponder];
                [
_textField3 becomeFirstResponder];
               
_textField3.text = @" ";
                textField.
enabled = NO;
            }
        }
else if (textField == _textField3 ){
           
if (textField.text.length >= 5) {
               
_textField4.enabled = YES;
                [textField
resignFirstResponder];
                [
_textField4 becomeFirstResponder];
               
_textField4.text = @" ";
                textField.
enabled = NO;
            }
        }
    }
   
if (_textField1.text.length + _textField2.text.length + _textField3.text.length + _textField4.text.length>= 20) {
       
self.checkLeftBtn.enabled = YES;
       
self.saveAndUseBtn.enabled = YES;
    }
   
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值