UITextField:退格无法正常工作

时间:2011-09-22 07:36:29

标签: iphone uitextfield

UITextField的验证存在问题。我想验证UITextField's文本长度为5(固定)。

我的代码:

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
    if(textField==codeTxt)
    {
         NSCharacterSet *unacceptedInput = [[NSCharacterSet characterSetWithCharactersInString:NUMBERS]invertedSet] ;

         if ([[string componentsSeparatedByCharactersInSet:unacceptedInput] count] > 1)
            return NO;

        else if ([codeTxt.text length] >= 5])
            return NO;

        else
            return YES;
    }
}

此代码工作正常。它验证并忽略了其余的文本(更多的是5)。

我的问题: 当我按Delete(退格键)时,没有任何反应!文字保持不变。删除(退格)不起作用。

可能是什么问题?

...谢谢

3 个答案:

答案 0 :(得分:4)

将此条件放在shouldChangeCharactersInRange方法

中的第一个语句中
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
    if([string length]==0)
    {
        return YES;
    }
    if(textField==codeTxt)
    {
         NSCharacterSet *unacceptedInput = [[NSCharacterSet characterSetWithCharactersInString:NUMBERS]invertedSet] ;

         if ([[string componentsSeparatedByCharactersInSet:unacceptedInput] count] > 1)
            return NO;

        else if ([codeTxt.text length] >= 5])
            return NO;

        else
            return YES;
    }
}

答案 1 :(得分:1)

您只需检查字段中当前文本的长度。在文本更改之前调用此方法,因此您需要先检查replacementString的长度,然后检查textField的文本长度。

试试这个:

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
    if (textField == codeTxt) {
         // NSCharacterSet *unacceptedInput = [[NSCharacterSet characterSetWithCharactersInString:NUMBERS] invertedSet];
         // if ([[string componentsSeparatedByCharactersInSet:[unacceptedInput count]] > 1) {
         if ([[string componentsSeparatedByCharactersInSet:[[[NSCharacterSet characterSetWithCharactersInString:NUMBERS] invertedSet] autorelease]] count] > 1) {
            return NO;
        } else if ([string length] < 5) {
             return YES;
        } else if ([codeTxt.text length] >= 5]) {
            return NO;
        } else {
            return YES;
        }
    }
}

编辑:

在执行textField后可能甚至不需要检查[codeTxt.text length] >= 5]的长度,因为这样可以防止textField的长度始终超过4。< /击>

实际上,您需要检查它,因为默认值为return YES;


可能需要&lt; = 5

        } else if ([string length] <= 5) {
             return YES;
        }

而不是&lt; 5也是

        } else if ([string length] < 5) {
             return YES;
        }

答案 2 :(得分:0)

我得到了解决方案

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
    if(textField==codeTxt)
    {

        NSCharacterSet *unacceptedInput = [[NSCharacterSet characterSetWithCharactersInString:NUMBERS]invertedSet] ;
        NSLog(@"textfield character validation method called");


        NSLog(@"%d",[codeTxt.text length]);

        if ([[string componentsSeparatedByCharactersInSet:unacceptedInput] count] > 1)
            return NO;

        else if ([codeTxt.text length] >= 5 && ![string isEqual:@""])
            return NO;

        else
            return YES;
    }
}