开发者

UITextField restriction-iphone

开发者 https://www.devze.com 2023-03-27 21:01 出处:网络
I\'m having 4 textfields in my application 1.username 2.Email 3.Age 4.Password User names are 3-25 characters and contain only开发者_如何学C the characters [a-z0-9]

I'm having 4 textfields in my application

1.username 2.Email 3.Age 4.Password

User names are 3-25 characters and contain only开发者_如何学C the characters [a-z0-9]

Age must be between 1-100 inclusive.

Passwords are between 4-12 characters and use only the characters [a-zA-Z0-9]

how can i restrict the textfield with above requirements

please anyone help me out to do this..

Thank you for your effort and consideration.


You can use the methods in the UITextFieldDelegate protocol to validate your fields' content.

More concretely, either you use:

– textFieldShouldEndEditing:
- textFieldShouldReturn:

or you can use:

- textField:shouldChangeCharactersInRange:replacementString:

In the first case, you only validate when the user ends editing the text field; in the second case, you can do the validation at each keystroke.

In all of those methods, you receive an argument textField which you can access like this:

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


You can validate numbers as the user type by implementing -[UITextField textField:shouldChangeCharactersInRange:replacementString:] method. Do note that this method is called before the change is made, so you need to construct the text that could be the result of the users actions yourself. For example:

-(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.
}

What you do from there is up to your own. Some examples could be:

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

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

For more complex number validation I would use NSNumberFormatter, that has support for validating ranges and more.


You can use UITextFieldDelegate to get done what you want. Assign different values to textfield.tag for each field in - (void)viewDidLoad method and match those tag values to find the relevant field in the (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]];
}
0

精彩评论

暂无评论...
验证码 换一张
取 消