[英]Initialising a category in objective-c
我正在為UITextField
寫一個類別以包括驗證。 我希望根據驗證狀態更改文本字段的視覺效果(例如,將批准的圖標作為其右視圖)。 為此,我保留了一個驗證狀態屬性,並希望更新其設置器上的外觀。
這是我所擁有的(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
?
請勿為此使用類別。 子類代替。 或者,更好的是,按預期使用UITextField的委托進行驗證。
使用類別擴展現有系統類的行為通常被認為是錯誤的設計。
通過使用委托,您可以將輸入驗證與特定輸入類解耦,因此,您的驗證可以輕松地在其他輸入機制之間重復使用。
您想將存儲添加到類UITextField(用於保存數據的簡單ivar)。 由於您沒有代碼,因此無法擴展該類。 但是,在目標C中,您可以使用關聯的參考來實現。 ObjC Runtime非常方便,可以幫助您將存儲連接到您的班級,並使您與該存儲區進行交互,就好像它是在班級中內置的一樣。
有關如何實現此目標的示例,請參見以下網址的Ole Begemann博客: http: //oleb.net/blog/2011/05/faking-ivars-in-objc-categories-with-associative-references/
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.