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 值(不带 .),并将 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;
    }
}
于 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 回答