Prajan
Prajan

Reputation: 666

UITextField restriction-iphone

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

Upvotes: 0

Views: 523

Answers (3)

Aruna
Aruna

Reputation: 701

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]];
}

Upvotes: 0

PeyloW
PeyloW

Reputation: 36752

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.

Upvotes: 1

sergio
sergio

Reputation: 69027

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;
}

Upvotes: 1

Related Questions