我正在为UITextField
编写一个类别以包含验证。我希望根据验证状态更改文本字段的视觉效果(例如将已批准的图标作为其右视图)。为此,我保留了一个验证状态属性,并希望更新其setter上的视觉效果。
这里有我的(UITextField + Validation.h)
@interface UITextField (Validation)
// Validator registration
- (void)addValidator:(id<HyValidator>)validator;
// Validation
- (void)validate;
@end
的UITextField + Validation.m
@interface UITextField (Validation_Private)
@property (nonatomic, strong) NSMutableArray * validators;
@property (nonatomic) HyValidationState validationState;
@end
@implementation UITextField (Validation_Private)
- (NSMutableArray*)validators
{
if (self.validators == nil) {
self.validators = [[NSMutableArray alloc] init];
}
return self.validators;
}
- (void)setValidators:(NSMutableArray *)validators
{
self.validators = validators;
}
- (HyValidationState)validationState
{
}
- (void)setValidationState:(HyValidationState)validationState
{
}
- (void)addValidator:(id<HyValidator>)validator
{
[[self validators] addObject:validator];
}
- (void)validate
{
}
@end
问题是:如何初始化validators
和validationState
?
答案 0 :(得分:4)
不要使用类别。而是子类。或者,更好的是,使用UITextField's delegate按预期进行验证。
使用类别来扩展现有系统类的行为通常被认为是糟糕的设计。
通过使用委托,您可以将输入验证与特定输入类分离,因此,您的验证可以轻松地在其他输入机制中重复使用。
答案 1 :(得分:2)
您想要为您的类UITextField添加存储空间(简单的ivar来保存数据)。由于您没有代码,因此无法扩展该类。但是在目标C中,您可以使用相关参考来实现此目的。 ObjC Runtime可以帮助您将存储附加到您的类,并使您与存储进行交互,就好像它是在类中构建的一样。
Ole Begemann博客http://oleb.net/blog/2011/05/faking-ivars-in-objc-categories-with-associative-references/
中提供了如何实现这一目标的示例