在objective-c中初始化类别

时间:2014-09-08 16:24:21

标签: ios objective-c initialization objective-c-category

我正在为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

问题是:如何初始化validatorsvalidationState

2 个答案:

答案 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/

中提供了如何实现这一目标的示例