ALPValidator 为您的 iOS 应用提供用户输入验证功能。它具备以下特性:多个内建验证规则、一些方便的方法来验证用户输入、一个验证状态改变处理块、公开的错误消息集合、以及一个对 UIView 提供验证输入功能的类别。它不主观臆断,是您的应用程序,您可以根据自己的意愿来处理 UI 上的验证错误。
内建验证
注意:演示中展示的 UI 与库无关,它是功能展示的一部分。
使用 CocoaPods 安装
pod 'ALPValidator'
导入
#import "ALPValidator.h"
使用以下方法创建一个字符串验证实例
ALPValidator *validator = [ALPValidator validatorWithType:ALPValidatorTypeString];
或者创建一个数字验证实例
ALPValidator *validator = [ALPValidator validatorWithType:ALPValidatorTypeNumeric];
或者创建一个通用的验证实例
`ALPValidator *validator = [ALPValidator validator];
使用 addRule
方法添加验证规则。当添加规则时,您可以提供一个错误消息字符串作为参数,如果在验证失败时,它将出现在 errorMessages
数组中。一些 addRule
方法可能需要额外的参数,它们应该是自解释的。您可以向验证器添加任意多的验证规则。
- (void)addValidationToEnsurePresenceWithInvalidMessage:(NSString *)message;
- (void)addValidationToEnsureMinimumLength:(NSUInteger)minLength invalidMessage:(NSString message;
- (void)addValidationToEnsureMaximumLength:(NSUInteger)maxLength invalidMessage:(NSString *)message;
- (void)addValidationToEnsureRangeWithMinimum:(NSNumber *)min maximum:(NSNumber *)max invalidMessage:(NSString *)message;
- (void)addValidationToEnsureInstanceIsTheSameAs:(id)otherInstance invalidMessage:(NSString *)message;
- (void)addValidationToEnsureRegularExpressionIsMetWithPattern:(NSString *)pattern invalidMessage:(NSString *)message;
- (void)addValidationToEnsureValidEmailWithInvalidMessage:(NSString *)message;
YES
或 NO
)- (void)addValidationToEnsureCustomConditionIsSatisfiedWithBlock:(ALPValidatorCustomRuleBlock)block invalidMessage:(NSString *)message;
- (void)addValidationToEnsureRemoteConditionIsSatisfiedAtURL:(NSURL *)url invalidMessage:(NSString *)message;
- (void)addValidationToEnsureStringContainsNumberWithInvalidMessage:(NSString *)message;
使用 validate:
方法来验证一个实例
ALPValidator *validator = [ALPValidator validatorWithType:ALPValidatorTypeString];
[validator addValidationToEnsureValidEmailWithInvalidMessage:NSLocalizedString(@"That's not an email!", nil)];
[validator validate:@"hey"];
这将更改变量验证器的 state
属性为 ALPValidatorValidationStateInvalid
,并且 isValid
方法将返回 NO
。
当用户在一个控件中输入时,你可以这样进行验证
- (void)viewDidLoad
{
[super viewDidLoad];
[self.someTextField addTarget:self action:@selector(textFieldTextChanged:) forControlEvents:UIControlEventEditingChanged];
}
- (void)textFieldTextChanged:(UITextField *)sender
{
[self.someValidator validate:sender.text];
}
或者,可以使用 UIView+ALPValidator
分类中定义的 alp_attachValidator:
方法来自动配置验证功能。
[self.someTextField alp_attachValidator:someStringValidator];
使用 validatorStateChangedHandler
在验证状态发生更改时收到通知。
self.someValidator = [ALPValidator validatorWithType:ALPValidatorTypeString];
self.someValidator.validatorStateChangedHandler = ^(ALPValidatorState newState) {
switch (newState) {
case ALPValidatorValidationStateValid:
// do happy things
break;
case ALPValidatorValidationStateInvalid:
// do unhappy things
break;
case ALPValidatorValidationStateWaitingForRemote:
// do loading indicator things
break;
}
};
查看本存储库中包含的示例,了解如何使用状态更改处理器在用户输入控件时更新 UI 的验证状态。
当验证器失败时,添加规则时传递的任何错误消息都将添加到公共 errorMessages
数组中。你可能可以使用此数组来通知用户其输入为何不够标准。
ALPValidator *mixedValidator = [ALPValidator validatorWithType:ALPValidatorTypeString];
[mixedValidator addValidationToEnsureMinimumLength:15 invalidMessage:NSLocalizedString(@"This is too short!", nil)];
[mixedValidator addValidationToEnsureCustomConditionIsSatisfiedWithBlock:^BOOL(NSString *instance) {
return ([instance rangeOfString:@"A"].location == NSNotFound);
} invalidMessage:NSLocalizedString(@"No capital As are allowed!", nil)];
[mixedValidator addValidationToEnsureValidEmailWithInvalidMessage:NSLocalizedString(@"That's not an email address!", nil)];
[mixedValidator validate:@"invA@lid,com"];
NSLog(@"%@", mixedValidator);
上面的代码将输出类似于以下内容的日志
ALPStringValidator 0x10911ddc0: {
"_state" = 0;
errorMessages = (
"This is too short!",
"No capital As are allowed!",
"That's not an email address!"
);
"state as string" = Invalid;
}
UIView+ALPValidator
分类扩展了 UIView
,以在用户更改输入值时提供即时验证。
使用 alp_attachValidator:
来自动配置验证器,当输入发生变化时调用 validate:
(这将触发状态更改块)。
[self.textField alp_attachValidator:self.validator];
使用 alp_removeValidators
来移除自动验证。
请参阅使用 UIView 分类进行验证的示例项目。
UITextField
UITextView
与 jQuery 验证 插件类似,ALPValidator 支持远程验证。你可以向验证器实例添加一个远程验证规则来确保服务器端条件满足。例如,这可能是条件:不允许两个用户以相同的用户名注册您的服务。
通常,在填充完整的注册表单并点击按钮后,您可能需要向注册服务发起请求。您只有在服务返回包含错误信息在 JSON 响应中之类的错误后,才会通知用户已选择的用户名已被占用。如果用户在输入时异步请求并更新 UI 以更接近实时告诉用户,这种体验将得到改善。
ALPValidator *remoteValidator = [ALPValidator validatorWithType:ALPValidatorTypeString];
[remoteValidator addValidationToEnsureRemoteConditionIsSatisfiedAtURL:[NSURL URLWithString:@"http://app-backend.com/api/usernameavailable"] invalidMessage:NSLocalizedString(@"That username has been taken", nil)];
现在当调用 validate:
时,验证器将把 state
属性更改为 ALPValidatorValidationStateWaitingForRemote
,直到服务器响应。然后,根据响应将其更改到 ALPValidatorValidationStateValid
或 ALPValidatorValidationStateInvalid
。
如果响应为 JSON true
,则验证规则通过;如果 JSON false
或其他任何内容,则失败。如果服务器通过错误未响应,验证也将失败。
可选地遵守 <ALPValidatorDelegate>
并设置 delegate
属性,以在服务器成功响应或请求失败时接收通知。您应该实现的信息相关的委托方法是定义在 <ALPValidatorDelegate>
@protocol ALPValidatorDelegate <NSObject>
@optional
- (void)validator:(ALPValidator *)validator remoteValidationAtURL:(NSURL *)url receivedResult:(BOOL)remoteConditionValid;
- (void)validator:(ALPValidator *)validator remoteValidationAtURL:(NSURL *)url failedWithError:(NSError *)error;
@end
你可能想在请求中提供额外参数,你可以在通过提供包含任何附加参数的 NSDictionary
的 validate:parameters:
方法中这样做。
远程验证请求以HTTP POST请求的形式发送,内容类型为application/json
。HTTP正文包含一个JSON字符串,该字符串包含"instance":
属性(您想要验证的内容)和一个"extras":
属性(如果传递了一个NSDictionary
,则包含任何附加参数)。您应该能够在服务器端代码中获取这些信息,并在评估一些条件后进行响应。
已在这存储库中包含一个Xcode项目,包含每个验证规则和一些其他功能的示例。要测试远程验证,请使用ruby demo_server.rb
命令启动Sinatra服务器。
欢迎贡献力量。在发起拉取请求之前,请确保在更改现有代码或在新的规范中支撑新功能时,所有Kiwi规范都通过。同时,请更新README,包含任何新功能。谢谢。
ALPValidator受jQuery Validation和ParsleyJS的启发,谢谢。
在此,免费许可任何获得此软件及其相关文档文件(以下简称“软件”)副本的人,任其在不受限制的情况下处理此软件,包括(但不限于)使用、复制、修改、合并、发布、分发、转授许可和/或出售软件复制品,并允许将软件提供给任何接收者以供其按本许可证的规定ことをする。
上述版权声明和本许可声明应包含在软件复制品的所有副本或实质部分中。
软件按“现状”提供,不提供任何形式的保证,无论是明示的还是暗示的,包括但不限于适销性、适于特定目的性和非侵权性。在任何情况下,作者或版权持有人不应对因使用或否则处理软件或使用或否则处理软件而产生的任何索赔、损害或其他责任承担责任,无论该责任是否基于合同、侵权或其他法律行为,也不论该责任是从软件或使用或否则处理软件中产生的,还是与之相关。