SPXDataValidators 1.4.1

SPXDataValidators 1.4.1

测试已测试
语言 Obj-CObjective C
许可证 MIT
发布上次发布2015年5月

Shaps 维护。



数据验证器

更新

  • 现在包含三个新的验证器
    • SPXEmailDataValidator
    • SPXBlockDataValidator
    • SPXRegexDataValidator
  • 新的 SPXFormValidator,用于同时在用户界面中验证多个字段
  • 验证器现在可以从 Interface Builder 添加到您的 UITextFieldUITextView 实例。
    • 验证器还可以在 IB 中跨多个字段重用
  • 为验证器添加了新的运行时属性(IBInspectable),以便更容易地从 IB 分配常见的验证

这些验证器与我发布的另一个开源项目 SPXControls 协同工作得非常好

正确的验证方法!

下载示例项目以查看其实际效果,或查看 演示文稿

请注意,演示文稿略有陈旧,因此在实际代码中可能发现细微的变化。如有疑问,请查看代码 ;)

我所采用的方法大量使用了以下最佳实践:

  • 单一职责原则
  • 关注点分离
  • 组合
  • 可重用性
  • 不可变性

我创建这些验证器是因为我不想使用绑定到表单且包含我不需要的额外表单构建基础设施的第三方解决方案。我希望有一些我可以更轻松地将其添加到项目中,并覆盖更多的情况(不仅仅是 UI)以及清理我的视图控制器。

我找不到合适的解决方案,所以我亲自创建了它。它很简单,但非常有效。希望你会喜欢它,请在 Twitter 上告诉我 ;)

简单用法

在最简单的情况下,您可以使用验证器如下所示:

SPXRegexDataValidator *validator = [SPXRegexDataValidator emailValidator];
self.signInButton.enabled = [validator validateValue:email error:nil]

如果您正在使用 <SPXDataField> 实例 -- 例如 UITextFieldUITextView 等...

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 文件。