IQRuleValidationManager 0.0.2

IQRuleValidationManager 0.0.2

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

junhg 维护。



  • JunHg

IQRuleValidationManager 使用说明

本文档主要描述 IQRuleValidationManager 在开发中的使用说明

UITextField、UITextView 常规验证

验证 UITextField、UITextView 的输入时,需要在实现的方法中实现 UItextView 的 delegate 方法

- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text
{
    BOOL validate = NO;
    //验证条件
    return Validate;
}

实现 UITextField 的 delegate 方法

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
    BOOL validate = NO;
    //验证条件
    return Validate;
}

- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
    BOOL validate = NO;
    //验证条件
    return Validate;
}

- (BOOL)textFieldShouldEndEditing:(UITextField *)textField
{
    BOOL validate = NO;
    //验证条件
    return Validate;
}

如果模块中较多地使用 UITextField、UITextView,同时验证的内容可能大部分相同,比如:长度限制、数字限定、小数点限制等。

为了统一处理 UITextField、UITextView 的内容,使得验证的方法可以统一管理,从而提出 IQRuleValidationManager

IQRuleValidationManager 使用

使用 UITextField、UITextView 的实现文件中 必须遵循 UItextViewDelegate/UITextFieldDelegate,在 IQRuleExpression 原理 中将会分析该规则,采用 UITextField、UITextView 的类别方法完成上述验证

@interface classA<UITextFieldDelegate>
@property(strong) UITextField *textField;

self.textField.ruleType = IQRuleValidationType中的一种类型
self.textField..delegate = self;
或使用
self.textField.ruleManagerClassName = @"自定义的规则名字";
self.textField..delegate = self;

IQRuleValidationManager 原理

IQRuleValidationManager 主要采用 swizzle 技术对于 遵循 UItextViewDelegate/UITextFieldDelegate 的类替换/添加相应的方法

未实现协议的实现原理图如下所示 未实现协议的原理图

实现协议的实现原理图如下所示 实现协议的原理图

IQIndirectlyImplementProtocolManager

默认实现 UITextFieldDelegate/UITextViewDelegate 的方法,提供 遵循 UItextViewDelegate/UITextFieldDelegate 的类为实现其协议方法时为其添加默认的实现方法,用于能够 swizzle 到相关的实现代码

IQRuleValidationManager

实现 UITextField/UITextView 的具体规则,可以定义其基类,并实现 IQRuleValidationManager 协议

@protocol IQRuleValidationManager <NSObject>

@required
/**
 *  @brief  提供对应于IQRuleValidationType所处理的类名,继承的子类都必须提供该方法
 *
 *  @return 类名
 */
+ (nonnull NSString *)validationClassName;

@optional
/**
 *  @brief  提供对应于IQRuleValidationType所处理的正则表达式,继承的子类都必须提供该方法
 *
 *  @param type 定义的处理类型
 *
 *  @return 返回正则表达式字符串
 */
- (nonnull NSString *)regularExpressionWhenChanged;
/**
 *  @brief  提供对应于IQRuleValidationType所处理的正则表达式,继承的子类都必须提供该方法
 *
 *  @param type 定义的处理类型
 *
 *  @return 返回正则表达式字符串
 */
- (nonnull NSString *)regularExpressionWhileEndEditing;

@end

默认的 IQRuleValidationManager 类提供了目前项目中用到的基本规则,主要定义在 IQRuleValidationType 中،该 IQRuleValidationType 的字段含义如下所示

typedef NS_ENUM(NSUInteger, IQRuleValidationType)
{
    IQRuleValidationNone = 0,
    IQRuleValidationNumber,                       // such as 1, 11,1111,11111
    IQRuleValidationNumberWithTwoDecimalPoint, // such as 1.23, 11.23 111.23,1111.23
    IQRuleValidationMobile,                     //
    IQRuleValidationAlphaAndNumber,             // such as a132,abcd1
    IQRuleValidationAlpha,                      // such as Aa, AAa, AAAa
    IQRuleValidationUppercaseAlpha,             // such as A, AA, AAA
    IQRuleValidationLowercaseAlpha,             // such as a, aa, aaa
    IQRuleValidationAlphaAndNumberAndUnderLine, // such a_43, a43, ab
    IQRuleValidationMonthInYear,                // such as 01, 02, 1, 2
    IQRuleValidationDaysInMonth,                // such as 1, 2, 3 ..31
    IQRuleValidationEmail,
};

IQRuleValidationManager 缺陷

目前所用到的规则较少,暂代更新,欢迎各位大神对代码进行完善及提好的意见