Ограничение NSString числами, а также #, если введены символы.(код включен) - PullRequest
2 голосов
/ 03 декабря 2011

Я искал на сайте свой ответ, однако я думаю, что это также, как я попал в эту проблему.

Я пытаюсь ограничить свое 1 и только текстовое поле 10 символами и только цифрами.

Ниже приведен код в основном с другими вопросами на этом сайте.Что я пытаюсь сделать, так это скомбинировать этот код для моих пределов

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
    NSCharacterSet *cs = [[NSCharacterSet characterSetWithCharactersInString:LEGAL] invertedSet];
    NSString *filtered = [[string componentsSeparatedByCharactersInSet:cs] componentsJoinedByString:@""];
    NSString *newString = [myTextField.text stringByReplacingCharactersInRange:range withString:filtered]; 
    return !([newString length] > 10);
}

С моей сборкой проблем не возникает, пока я не нажму на текстовое поле ... но я получаю предупреждение с зеленой стрелкой, в котором "поток остановлен наточка останова 1 «Я попробовал несколько разных вещей сейчас, но теперь чувствую, что я в замешательстве, я надеюсь, что это что-то очень легко для кого-то здесь ...

они будут работать индивидуально (один или другой) с кодом ниже, но я не могу заставить их работать вместе.

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
    NSString *newString = [myTextField.text stringByReplacingCharactersInRange:range withString:string];
    return !([newString length] > 10);
}

Это ограничит мой ввод до 10 и ...

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
    NSCharacterSet *cs = [[NSCharacterSet characterSetWithCharactersInString:LEGAL] invertedSet];
    NSString *filtered = [[string componentsSeparatedByCharactersInSet:cs] componentsJoinedByString:@""];
    return [string isEqualToString:filtered];
}

Это также ограничиваетмой ввод в числа только без проблем.при условии, что я определил LEGAL как только числа ...

Я просто не могу заставить их работать вместе ... Может кто-нибудь помочь мне с этим ???

1 Ответ

1 голос
/ 04 декабря 2011

Есть много способов сделать это, но я думаю, что это может быть наиболее понятным:

-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{
    // Check for non-numeric characters
    NSUInteger lengthOfString = string.length;
    for (NSInteger loopIndex = 0; loopIndex < lengthOfString; loopIndex++) {
        unichar character = [string characterAtIndex:loopIndex];
        if (character < 48) return NO; // 48 unichar for 0
        if (character > 57) return NO; // 57 unichar for 9
    }
    // Check for total length
    NSUInteger proposedNewLength = textField.text.length - range.length + string.length;
    if (proposedNewLength > 10) return NO;
    return YES;
}

Первый раздел по существу проверяет непустую строку на наличие символов, которые не находятся между '0' и«9», если он находит его где-либо в новой строке, отклоняет редактирование.Второй определяет, какой будет длина текста, если редактирование завершено, и сравнивает с 10, если оно слишком высокое, отклоняет редактирование.Если функция проходит все эти тесты, редактирование разрешено.

С моей сборкой проблем не возникает, пока я не нажму на текстовое поле ... но я получаю предупреждение с зеленой стрелкой, указывающее " thread stopped at breakpoint 1 "

Вы, очевидно, установили точку останова в своем методе textField:shouldChangeCharactersInRange:replacementString:.Если вы не знакомы с точками останова, они выглядят следующим образом: (синяя стрелка в столбце номеров строк). Вы также можете переключаться между ними, нажимая кнопку, изображенную справа:

enter image description here enter image description here

Точки останова очень удобны, и я предлагаю вам научиться их использовать.Но сейчас просто нажмите на точку останова и перетащите ее из столбца, как значок на панели, или отключите эту опцию.

...