UITextField: Backspace не работает - PullRequest
       0

UITextField: Backspace не работает

2 голосов
/ 22 сентября 2011

У меня проблема с проверкой 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 (Backspace), ничего не происходит !!!текст остается прежним.delete (Backspace) не работает.

в чем может быть проблема?

Спасибо ...

Ответы [ 3 ]

4 голосов
/ 22 сентября 2011

поместите это условие в первый оператор в методе 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 голос
/ 22 сентября 2011

Вы проверяете только длину текущего текста в поле.Этот метод вызывается до изменения текста, поэтому вам нужно сначала проверить длину 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;.


Вероятно, должно быть <= 5 </p>

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

Вместо <5 слишком </p>

        } else if ([string length] < 5) {
             return YES;
        }
0 голосов
/ 22 сентября 2011

Я получил решение

- (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;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...