💀 这个库已被重写为 Swift 2.0,并且不再使用 Objective-C 维护(见 master。这里安放的是最终版本(0.0.8)。
AJWValidator 为您的 iOS 应用提供了即插即用的用户输入验证。它包含一组内置的验证规则,以及一些方便的方法来验证用户输入。它还包含验证状态改变的处理块、公开的错误消息集合,以及 UIView 的类别以为支持的输入视图类型提供验证为输入的功能。它是中立的,这是您的应用,您有权决定如何在 UI 上处理验证错误。
内置验证
注意:演示中的 UI 与库无关,它只是展示的功能之一。
使用 CocoaPods 安装
pod 'AJWValidator'
导入
#import "AJWValidator.h"
使用以下方式创建一个字符串验证实例:
AJWValidator *validator = [AJWValidator validatorWithType:AJWValidatorTypeString];
或者创建一个数值验证器:
AJWValidator *validator = [AJWValidator validatorWithType:AJWValidatorTypeNumeric];
或者创建一个通用验证器:
`AJWValidator *validator = [AJWValidator 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:(AJWValidatorCustomRuleBlock)block invalidMessage:(NSString *)message;
- (void)addValidationToEnsureRemoteConditionIsSatisfiedAtURL:(NSURL *)url invalidMessage:(NSString *)message;
- (void)addValidationToEnsureStringContainsNumberWithInvalidMessage:(NSString *)message;
使用validate:
方法校验实例
AJWValidator *validator = [AJWValidator validatorWithType:AJWValidatorTypeString];
[validator addValidationToEnsureValidEmailWithInvalidMessage:NSLocalizedString(@"That's not an email!", nil)];
[validator validate:@"hey"];
这将改变校验器对象的state
属性为AJWValidatorValidationStateInvalid
,并且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+AJWValidor
类别中定义的AJW_attachValidator:
方法来自动配置验证改变功能。
[self.someTextField AJW_attachValidator:someStringValidator];
使用validatorStateChangedHandler
来通知验证状态的改变。
self.someValidator = [AJWValidator validatorWithType:AJWValidatorTypeString];
self.someValidator.validatorStateChangedHandler = ^(AJWValidatorState newState) {
switch (newState) {
case AJWValidatorValidationStateValid:
// do happy things
break;
case AJWValidatorValidationStateInvalid:
// do unhappy things
break;
case AJWValidatorValidationStateWaitingForRemote:
// do loading indicator things
break;
}
};
查看此仓库中包含的示例以了解如何使用状态更改处理器在用户输入控件时更新UI以及验证状态。
当一个校验器失败时,在添加规则时传递的任何错误消息都将添加到公共的errorMessages
数组中。或许你可以使用这个数组来通知用户为什么他们的输入不达标。
AJWValidator *mixedValidator = [AJWValidator validatorWithType:AJWValidatorTypeString];
[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);
上面的代码将类似以下方式使用NSLog
AJWStringValidator 0x10911ddc0: {
"_state" = 0;
errorMessages = (
"This is too short!",
"No capital As are allowed!",
"That's not an email address!"
);
"state as string" = Invalid;
}
UIView+AJWValidator
类别扩展了UIView
,以提供用户输入值改变时的即时验证。
使用AJW_attachValidator:
来自动配置校验器,当输入值改变时调用validate:
(这将触发状态改变块)。
[self.textField AJW_attachValidator:self.validator];
使用AJW_removeValidators
来移除自动验证。
查看使用UIView类别进行实时验证的示例项目。
UITextField
UITextView
与jQuery Validation插件一样,AJWValidator支持远程验证。你可以在校验器实例中添加远程验证规则,以确保服务器端条件得到满足。这可能是一个条件,即两个用户不能使用相同的用户名注册到你的服务中。
通常,你可能在填写完整注册表单并点击按钮后向你的注册服务发起请求。只有在服务返回含有JSON响应或类似内容的错误后,你才会通知用户他们选择的用户名已被占用。如果用户在输入时进行异步请求并且UI更新以实时通知用户,这种体验将得到提升。
AJWValidator *remoteValidator = [AJWValidator validatorWithType:AJWValidatorTypeString];
[remoteValidator addValidationToEnsureRemoteConditionIsSatisfiedAtURL:[NSURL URLWithString:@"http://app-backend.com/api/usernameavailable"] invalidMessage:NSLocalizedString(@"That username has been taken", nil)];
现在当调用validate:
时,校验器将改变state
属性为AJWValidatorValidationStateWaitingForRemote
,直到服务器响应。然后根据响应将其更改为AJWValidatorValidationStateValid
或AJWValidatorValidationStateInvalid
。
如果响应是JSON中的true
,则验证规则通过,如果是JSON中的false
或任何其他内容,则会失败。如果服务器未能通过错误响应,验证也会失败。
可选地实现<AJWValidatorDelegate>
并设置delegate
属性以在服务器成功响应或请求失败时接收通知。为此应实现的委托方法定义在<AJWValidatorDelegate>
中。
@protocol AJWValidatorDelegate <NSObject>
@optional
- (void)validator:(AJWValidator *)validator remoteValidationAtURL:(NSURL *)url receivedResult:(BOOL)remoteConditionValid;
- (void)validator:(AJWValidator *)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中的任何新功能。谢谢。
AJWValidator受到jQuery Validation和ParsleyJS的启发,感谢。
本协议免费授予任何获得本软件和相关文档副本(以下简称“软件”)的人任意使用软件的权利,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或销售软件副本,并允许有权获得软件的人使用本软件,但受以下条件的约束:
上述版权声明和本许可声明应包含在软件的任何副本或主要部分的副本中。
软件按“现状”提供,不提供任何形式的保证,无论是明示的、默示的,还是其他形式的,包括但不限于适用性、针对特定目的的适用性和非侵权性保证。在任何情况下,作者或版权持有人都无需对任何索赔、损害或其他责任负责,无论这些责任是由于合同、疏忽还是其他原因引起的,并且与软件或软件的使用或其他处理有关。