Как отключить буквенные символы в UITextField? - PullRequest
9 голосов
/ 19 января 2011

В моем приложении мне нужно разрешить пользователям вводить только цифры. Как я могу разрешить UITextField получать только цифры от пользователя?

Ответы [ 10 ]

32 голосов
/ 19 января 2011

Символы в этом примере разрешены, поэтому, если вы не хотите, чтобы пользователь использовал символ, исключите его из myCharSet.

- (BOOL)textField:(UITextField *)theTextField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string 
{
    NSCharacterSet *myCharSet = [NSCharacterSet characterSetWithCharactersInString:@"0123456789"];
    for (int i = 0; i < [string length]; i++) {
        unichar c = [string characterAtIndex:i];
        if (![myCharSet characterIsMember:c]) {
            return NO;
        }
    }

    return YES;
} 
5 голосов
/ 28 марта 2012

Я предпочитаю следующее решение, которое фактически предотвращает любой ввод, кроме чисел и возврата. Backspace по какой-то причине представлен пустой строкой и не может использоваться, если пустая строка не возвращает YES. У меня также появляется всплывающее окно с предупреждением, когда пользователь вводит другой символ, кроме цифр.

- (BOOL)textField:(UITextField *)theTextField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string 
{
    if (string.length == 0) {
        return YES;
    }
    NSCharacterSet *myCharSet = [NSCharacterSet characterSetWithCharactersInString:@"0123456789"];
    for (int i = 0; i < [string length]; i++) {
        unichar c = [string characterAtIndex:i];
        if ([myCharSet characterIsMember:c]) {
            return YES;
        }
    }
    UIAlertView *av = [[UIAlertView alloc] initWithTitle:@"Invalid Input" message:@"Only numbers are allowed for participant number." delegate:self cancelButtonTitle:@"Dismiss" otherButtonTitles:nil];
    [av show];
    return NO;
}
3 голосов
/ 25 июля 2013

Это, пожалуй, самое чистое и простое решение, позволяющее использовать только положительные или отрицательные числа.Это также позволяет забой.

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

    NSCharacterSet *allowedCharacters = [NSCharacterSet characterSetWithCharactersInString:@"-0123456789"];

    if([string rangeOfCharacterFromSet:allowedCharacters.invertedSet].location == NSNotFound){

        return YES;

    }

    return NO;

}
2 голосов
/ 15 сентября 2015

In Swift

func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
    if textField.tag == 2 {  //your textField
        let invalid = NSCharacterSet(charactersInString: "aeiou")  //characters to block
        if let range = string.rangeOfCharacterFromSet(invalid) {
            return false
        }
    }

    return true
}
2 голосов
/ 30 октября 2012

Вот мое решение, использующее алгебру множеств с помощью метода isSupersetOfSet: Это также не позволяет вставлять текст с недопустимыми символами:

- (BOOL)textField:(UITextField *)theTextField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
    if (string.length == 0 || [_numericCharSet isSupersetOfSet:[NSCharacterSet characterSetWithCharactersInString:string]]) {
        return YES;
    }
    else {
        UIAlertView *av = [[UIAlertView alloc] initWithTitle:@"Invalid Input"
                                                     message:@"Only numeric input allowed."
                                                    delegate:self
                                           cancelButtonTitle:@"Close"
                                           otherButtonTitles:nil];
        [av show];
        return NO;
    }
}

Примечание: согласно Apple Developer Library , предпочтительнее кешировать статический NSCharacterSet, чем создавать его снова и снова (здесь _numericCharSet).

Однако я предпочитаю позволить пользователю вводить любой символ и проверять значение в методе textFieldShouldEndEditing:, вызываемом, когда textField пытается уйти в отставку первым респондентом. Таким образом, пользователь может вставить любой текст (возможно, составленный из сочетания букв и цифр) и привести его в текстовые поля. Пользователи не любят, когда их действия ограничены.

2 голосов
/ 25 июня 2012

вы, ребята, могли бы сгореть ... но у меня это сработало ... только цифры (включая негативы) и пробел.

NSCharacterSet *validCharSet;

if (range.location == 0) 
    validCharSet = [NSCharacterSet characterSetWithCharactersInString:@"0123456789-."];
else
    validCharSet = [NSCharacterSet characterSetWithCharactersInString:@"0123456789."];

if ([[string stringByTrimmingCharactersInSet:validCharSet] length] > 0 ) return NO;  //not allowable char


NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc] init];
[numberFormatter setNumberStyle:NSNumberFormatterDecimalStyle];

NSNumber* candidateNumber;

NSString* candidateString = [textField.text stringByReplacingCharactersInRange:range withString:string];

range = NSMakeRange(0, [candidateString length]);

[numberFormatter getObjectValue:&candidateNumber forString:candidateString range:&range error:nil];

if  (candidateNumber == nil ) {

    if  (candidateString.length <= 1) 
        return YES;
    else
        return NO;
}

return YES;
2 голосов
/ 19 января 2011

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

1 голос
/ 02 сентября 2015

Вот быстрый пример

func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {

    var disabledCharacters:NSCharacterSet = NSCharacterSet(charactersInString: "0123456789")
        for (var i:Int = 0; i < count(string); ++i) {
            var c = (string as NSString).characterAtIndex(i)
            if (disabledCharacters.characterIsMember(c)) {
                println("Can't use that character dude :/")
                return false
            }
        }

    return true
}

Не забудьте также добавить UITextFieldDelegate к UIViewController.

0 голосов
/ 17 октября 2016

Эта ветка немного старая, но для справки я собираюсь оставить решение в swift 3. Это решение объединит decimalDigits и фактическое десятичное число.Вы можете собрать любую комбинацию, какую захотите, но для моего случая это те требования, которые были.

// instantiate a mutable character set
let characterSet = NSMutableCharacterSet()
// assign the needed character set
characterSet.formUnion(with: NSCharacterSet.decimalDigits)
// only need the decimal character added to the character set
characterSet.addCharacters(in: ".")
// invert and return false if it's anything other than what we're looking for
if string.rangeOfCharacter(from: characterSet.inverted) != nil {
    return false
}
0 голосов
/ 28 марта 2012
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
    char *x = (char*)[string UTF8String];
    //NSLog(@"char index is %i",x[0]);
    if([string isEqualToString:@"-"] || [string isEqualToString:@"("] || [string isEqualToString:@")"] || [string isEqualToString:@"0"] || [string isEqualToString:@"1"] ||  [string isEqualToString:@"2"] ||  [string isEqualToString:@"3"] ||  [string isEqualToString:@"4"] ||  [string isEqualToString:@"5"] ||  [string isEqualToString:@"6"] ||  [string isEqualToString:@"7"] ||  [string isEqualToString:@"8"] ||  [string isEqualToString:@"9"] || x[0]==0 || [string isEqualToString:@" "]) {

    NSUInteger newLength = [textField.text length] + [string length] - range.length;
    return (newLength > 14) ? NO : YES;
} else {
    return NO;
}
}
...