1

文字列に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;
}

どうもありがとう

4

2 に答える 2

3

NSScannerは、フロートが文字列の先頭にあることを想定します。したがって、これに対抗するには、setCharactersToBeStrippedを使用します。

setCharactersToBeStrippedは、文字列からすべての非数値の非ピリオド文字を除外するため、スキャンする必要があるのは、探している数字だけです。

NSScannerは、int値(。なし)に一致するだけでなく、int123を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;
    }
}
于 2011-09-08T14:42:21.243 に答える
1

間違ったデリゲートメソッドを実装しています。textFieldShouldReturn:ユーザーがリターンキーを押すと呼び出されます。(あなたが考えていたのであれば、コントロールがフィールドから「戻ろう」としているときではありません。)

textFieldShouldEndEditing:代わりに実装する必要があります。ここで、テキストフィールドがファーストレスポンダーのステータスを失うのを防ぎ、キーボードを上げたままにすることができます(しようとします)。あなたがしているようにテキストをチェックして、YESまたはNOを返します(システムにファーストレスポンダーのステータスを更新させます)。

入力が有効な場合にリターンキーでキーボードを閉じたい場合は、そこで呼び出す必要がendEditing:あります。このような:

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

このNOパラメータは、強制しないことを意味し、基本的にtextFieldShouldEndEditing:コードが最初にテキストをチェックできるようにします。endEditing:(可能であれば、ではなく、常に電話する必要がありますresignFirstResponder。)

さまざまな理由により、テキストフィールドはとにかくファーストレスポンダーのステータスを放棄するように強制される可能性があることに注意してください。この方法で入力を検証している場合でも、ディスクに保存したり、ネットワークまたはあなたがそれでやりたいことは何でも。

于 2011-09-09T04:43:25.490 に答える