簡體   English   中英

在Objective-C中初始化類別

[英]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

問題是:如何初始化validatorsvalidationState

請勿為此使用類別。 子類代替。 或者,更好是,按預期使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM