SPXEmailDataValidator
SPXBlockDataValidator
SPXRegexDataValidator
SPXFormValidator
,用于同时在用户界面中验证多个字段UITextField
和 UITextView
实例。这些验证器与我发布的另一个开源项目 SPXControls 协同工作得非常好
下载示例项目以查看其实际效果,或查看 演示文稿。
请注意,演示文稿略有陈旧,因此在实际代码中可能发现细微的变化。如有疑问,请查看代码 ;)
我所采用的方法大量使用了以下最佳实践:
我创建这些验证器是因为我不想使用绑定到表单且包含我不需要的额外表单构建基础设施的第三方解决方案。我希望有一些我可以更轻松地将其添加到项目中,并覆盖更多的情况(不仅仅是 UI)以及清理我的视图控制器。
我找不到合适的解决方案,所以我亲自创建了它。它很简单,但非常有效。希望你会喜欢它,请在 Twitter 上告诉我 ;)
在最简单的情况下,您可以使用验证器如下所示:
SPXRegexDataValidator *validator = [SPXRegexDataValidator emailValidator];
self.signInButton.enabled = [validator validateValue:email error:nil]
如果您正在使用 <SPXDataField>
实例 -- 例如 UITextField
、UITextView
等...
self.signInButton.enabled = [SPXFormValidator validatorFields:@[ emailField, passwordField ]];
不过,您通常需要使用 UI 组件来验证用户输入。我已为 UITextField 和 UITextView 提供了类别,以便它们符合我的协议,您也可以轻松扩展自己的类(UI 或非 UI),然后调用以下内容:
NSError *error = nil;
if (![self.emailField validateWithError:&error]) {
// do something useful here
}
- (void)configureValidators
{
SPXEmptyDataValidator *emptyValidator = [SPXEmptyDataValidator new];
SPXEmailDataValidator *emailValidator = [SPXEmailValidator new];
NSOrderedSet *validators = [NSOrderedSet orderedSetWithObjects:emptyValidator, emailValidator, nil];
SPXCompoundDataValidator *usernameValidators = [SPXCompoundDataValidator validatorWithValidators:validators validationType:SPXCompoundDataValidatorValidateAll];
self.emailField.dataValidator = usernameValidators;
SPXPasswordDataValidator *passValidator = [SPXRegexDataValidator validatorWithExpression:regex];
validators = [NSOrderedSet orderedSetWithObjects:emptyValidator, passValidator, nil];
SPXCompoundDataValidator *passwordValidators = [SPXCompoundDataValidator validatorWithValidators:validators validationType:SPXCompoundDataValidatorValidateAll];
self.passwordField.dataValidator = passwordValidators;
}
为了提高可重用性,请在你的代码中某处提供一个工厂类,用于返回并可能甚至缓存它们。这将把你的视图控制器代码减少到以下样子
self.emailField = [ValidatorFactory emailValidator];
self.passwordField.dataValidator = [ValidatorFactory passwordValidator];
这种方法可高度重用,并允许你轻松地在整个项目中定义所有验证器。
这种方法使使用 SPXFormValidator
验证所有字段变得容易得多
- (IBAction)textFieldDidChange:(UITextField *)textField
{
// update the state of the signInButton as the user types in any field
self.navigationItem.rightBarButtonItem.enabled = [SPXFormValidator validateFields:@[ self.emailField, self.passwordField ]];
}
- (void)textFieldDidEndEditing:(UITextField *)textField
{
// decorate the current textField based on the validator
cell.accessoryView = [SPXFormValidator validateField:textField] ? nil : [self accessoryView];
}
下载并运行示例项目,以查看单个字段验证的实际效果 (;)
如果你有任何真正有用、可重用的验证器创意,请创建一个拉取请求,我将尽快提供它们。但请记住,不要在没有 测试 的情况下提交任何验证器...这会使 GitHub 的人感到悲伤 :(
在设计您的验证器时,请记住以下基本规则:
Shaps Mohsenin, @shaps
SPXDataValidators 可在 MIT 许可协议下获得。有关更多信息,请参阅 LICENSE 文件。