UITextField限制 - iPhone

时间:2011-08-12 10:04:05

标签: iphone uitextfield

我的应用程序中有4个文本域

1.username 2.Email 3,年龄 4.Password

用户名为3-25个字符,仅包含字符[a-z0-9]

年龄必须在1-100之间。

密码介于4到12个字符之间,仅使用字符[a-zA-Z0-9]

如何限制具有上述要求的文本字段

请有人帮我解决这个问题。

感谢您的努力和考虑。

3 个答案:

答案 0 :(得分:1)

您可以使用UITextFieldDelegate协议中的方法验证字段的内容。

更具体地说,要么使用:

– textFieldShouldEndEditing:
- textFieldShouldReturn:

或者您可以使用:

- textField:shouldChangeCharactersInRange:replacementString:

在第一种情况下,您只验证用户何时结束编辑文本字段;在第二种情况下,您可以在每次击键时进行验证。

在所有这些方法中,您都会收到一个参数textField,您可以这样访问:

NSString* text = textField.text;
NSUInterger length = [text length];
if (length.....) {
 // -- show alert or whatever
return NO;
}

答案 1 :(得分:1)

您可以通过实施-[UITextField textField:shouldChangeCharactersInRange:replacementString:]方法将数字验证为用户类型。请注意,此方法在进行更改之前称为 ,因此您需要构建可能是用户操作自身结果的文本。例如:

-(BOOL)textField:(UITextField*)textField: shouldChangeCharactersInRange:(NSRange*)range
                                                      replacementString:(NSString*)string;
{
    NSString* text = [textField.text stringByReplacingCharactersInRange:range
                                                             withString:string];
    // text is now the potential string you should check against.
}

你从那里做什么取决于你自己。一些例子可能是:

// Too short?
if ([text length] < 4) ...

// Invalid character?
NSCharacterSet* invalidChars = [[NSCharacterSet alphanumericCharacterSet] invertedSet];
if ([text rangeOfCharacterInSet:invalidChars].location != NSNotFound) ...

对于更复杂的数字验证,我会使用NSNumberFormatter,它支持验证范围等。

答案 2 :(得分:0)

您可以使用UITextFieldDelegate完成您想要的任务。为- (void)viewDidLoad方法中的每个字段为textfield.tag指定不同的值,并匹配这些标记值以查找(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string中的相关字段。

#define USERNAME_FIELD_TAG 1
#define PASSWORD_FIELD_TAG 2
#define EMAIL_FIELD_TAG 3
#define AGE_FIELD_TAG 4

#pragma mark - UITextFieldDelegate
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
    if (textField.tab == USERNAME_FIELD_TAG)
    {
        if([[NSPredicate predicateWithFormat:@"SELF MATCHES[cd] %@", @"[a-z0-9]{3,35}"] evaluateWithObject:string] == FALSE)
        {
            textField.text = [textField.text stringByReplacingOccurrencesOfString:string withString:@"" options:NSCaseInsensitiveSearch range:range];
            [self selectTextForInput:textField atRange:range];
            return NO;
        }
    }
    else if (textField.tab == PASSWORD_FIELD_TAG)
    {
        if([[NSPredicate predicateWithFormat:@"SELF MATCHES[cd] %@", @"[a-zA-Z0-9]{4,12}"] evaluateWithObject:string] == FALSE)
        {
            textField.text = [textField.text stringByReplacingOccurrencesOfString:string withString:@"" options:NSCaseInsensitiveSearch range:range];
            [self selectTextForInput:textField atRange:range];
            return NO;
        }
    }
    else if (textField.tab == EMAIL_FIELD_TAG)
    {
        if([[NSPredicate predicateWithFormat:@"SELF MATCHES[cd] %@", @"[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}"] evaluateWithObject:string] == FALSE)
        {
            textField.text = [textField.text stringByReplacingOccurrencesOfString:string withString:@"" options:NSCaseInsensitiveSearch range:range];
            [self selectTextForInput:textField atRange:range];
            return NO;
        }
    }
    else if (textField.tab == AGE_FIELD_TAG)
    {
        if([[NSPredicate predicateWithFormat:@"SELF MATCHES[cd] %@", @"[1-100]"] evaluateWithObject:string] == FALSE)
        {
            textField.text = [textField.text stringByReplacingOccurrencesOfString:string withString:@"" options:NSCaseInsensitiveSearch range:range];
            [self selectTextForInput:textField atRange:range];
            return NO;
        }
    }

    return YES;
}

// place the cursor at given possition
-(void)selectTextForInput:(UITextField *)input atRange:(NSRange)range {
    UITextPosition *start = [input positionFromPosition:[input beginningOfDocument]
                                                 offset:range.location];
    UITextPosition *end = [input positionFromPosition:start
                                               offset:range.length];
    [input setSelectedTextRange:[input textRangeFromPosition:start toPosition:end]];
}