определить, является ли строка числом с NSScanner - PullRequest
1 голос
/ 08 сентября 2011

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

Этот код всегда скрывает клавиатуру, даже если она не floatValue: знаете ли вы, как заставить ее работать?

- (BOOL)textFieldShouldReturn:(UITextField *)textField {

    NSScanner *scan = [NSScanner scannerWithString:[textField text]];
    if ([scan scanFloat:NULL]){

        [password resignFirstResponder];
        [passwordLength resignFirstResponder];
        return YES;

    } else {
        return NO;
    }
}

Кроме того, я не пробовал с циклами, но это начало, если у вас есть идеи:

BOOL doesStringContain(NSString* string, NSString* string2){
    for (int i=0; i<[string length]; i++) {
        NSString* chr = [string substringWithRange:NSMakeRange(i, 1)];
        for (int j=0; j<[string2 length]; j++){
            if([chr isEqualToString:j])
                return TRUE;
        }
    }
    return FALSE;
}

Большое спасибо

Ответы [ 2 ]

3 голосов
/ 08 сентября 2011

NSScanner будет ожидать, что ваш float будет в начале вашей строки.Поэтому для борьбы с этим мы используем setCharactersToBeStripped.

setCharactersToBeStripped отфильтровывает все нечисловые непериодические символы из строки, так что все, что у вас остается для сканирования, это число, которое вы ищете.

NSScanner будет соответствовать значениям int (без.), А также будет приравнивать int 123 к 123.00000.

- (BOOL)textFieldShouldReturn:(UITextField *)textField {    
    NSScanner *scan = [NSScanner scannerWithString:[textField text]];
    [scan setCharactersToBeSkipped:[[NSCharacterSet characterSetWithCharactersInString:@"1234567890."] invertedSet]];
    float f;
    if ([scan scanFloat:&f]){
        NSLog(@"Scanned a float %f",f);
        [textField resignFirstResponder];
        return YES;

    } else {
        NSLog(@"Did not scan a float");
        return NO;
    }
}

Если вы хотите проверить, есть ли не числовые символы, а только цифры, попробуйте:

- (BOOL)textFieldShouldReturn:(UITextField *)textField {    

    NSCharacterSet *withFloats = [NSCharacterSet characterSetWithCharactersInString:@"0123456789."];

    NSCharacterSet *withoutFloats = [NSCharacterSet decimalDigitCharacterSet];

    // Change withFloats <-> withoutFloats depending on your need
    NSString *newString = [[textField.text componentsSeparatedByCharactersInSet:withFloats] componentsJoinedByString:@""];

    NSLog(@"newString %@", newString);

    if ([newString isEqualToString:@""]){
        NSLog(@"Scanned a numeric");
        [textField resignFirstResponder];
        return YES;

    } else {
        NSLog(@"Did not scan a numeric");
        return NO;
    }
}
1 голос
/ 09 сентября 2011

Вы используете неправильный метод делегата.textFieldShouldReturn: вызывается, когда пользователь нажимает клавишу возврата.(Не тогда, когда контроль пытается «вернуться» с поля, если вы об этом думали.)

Вместо этого вы должны реализовать textFieldShouldEndEditing:.Именно здесь вы можете (попытаться) остановить текстовое поле от потери статуса первого респондента и держать клавиатуру включенной.Просто проверьте текст, как вы делаете, и верните ДА или НЕТ (пусть система обновит статус первого респондента).

Если вы хотите, чтобы клавиша возврата отклоняла клавиатуру, если ввод действителен, вы должны вызвать endEditing: там.Например:

- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
    return [textField endEditing:NO];
}

Параметр NO означает, что его не форсируют, и, в основном, ваш код textFieldShouldEndEditing: сначала проверяет текст.(Вы должны всегда звонить endEditing:, если можете, а не resignFirstResponder.)

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

...