我的应用程序中有4个文本域
1.username 2.Email 3,年龄 4.Password
用户名为3-25个字符,仅包含字符[a-z0-9]
年龄必须在1-100之间。
密码介于4到12个字符之间,仅使用字符[a-zA-Z0-9]
如何限制具有上述要求的文本字段
请有人帮我解决这个问题。
感谢您的努力和考虑。
答案 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]];
}