iOS - 自定義UITextField類設計與實現

現在講一下自定義的UITextField,這個類包含的功能暫時長度限制與emoji表情限制。主要講下設計思路,使得自定義的UITextField更具擴展易用性。

設計思路

  1. 用戶不需要操心基本功能的實現
  2. 肯定要具有原生UITextField的所有屬性方法。
  3. 控件獨立。

具體設計

首先自定義類HsUserTextField,繼承自UITextField,同時定義幫助類HsUserTextFieldHelper,實現UITextField的協議,畢竟自身的delegate不能是自己(==會導致死循環==)所以都讓幫助類去實現方法。同時幫助類還可以直接用于其它的UITextField類。

@interface HsUserTextFieldHelper : NSObject <UITextFieldDelegate>

@property (nonatomic, weak) HsUserTextField *helpObject;

@property (nonatomic, weak) id<HsUserTextFieldDelegate> delegate;

- (void)textFiledEditChanged;

- (NSString *)setMarkedText:(NSString *)markedText selectedRange:(NSRange)selectedRange;
@end

@interface HsUserTextField()
@property (nonatomic, strong)HsUserTextFieldHelper *helper;
@end

@implementation HsUserTextField
- (instancetype)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        [self addTarget:self.helper action:@selector(textFiledEditChanged) forControlEvents:UIControlEventEditingChanged];
        super.delegate = self.helper;
        self.supportEmoji = NO;
    }
    return self;
}
- (HsUserTextFieldHelper *)helper
{
    if (_helper == nil) {
        _helper = [[HsUserTextFieldHelper alloc] init];
        _helper.helpObject = self;
    }
    return _helper;
}

- (void)setDelegate:(id<HsUserTextFieldDelegate>)delegate
{
    self.helper.delegate = delegate;
    super.delegate = self.helper;
}

- (void)setMarkedText:(NSString *)markedText selectedRange:(NSRange)selectedRange
{
    NSString *helpMarkedText = [self.helper setMarkedText:markedText selectedRange:selectedRange];
    [super setMarkedText:helpMarkedText selectedRange:selectedRange];
}

- (void)dealloc{
   
}

@end

@implementation HsUserTextFieldHelper

- (BOOL)nowIsEmojiKeyBorad
{
    for (NSString *keyboardInputMode in [UITextInputMode activeInputModes]) {
        if ([[keyboardInputMode valueForKey:PrimaryLanguage] isEqualToString:EmojiprimaryLanguage]) {
            NSNumber *isDisplayed = [keyboardInputMode valueForKey:IsDisplayed];
            if ([isDisplayed boolValue] == YES) {
                return YES;
            }
        }
    }
    return false;
}

- (NSString *)setMarkedText:(NSString *)markedText selectedRange:(NSRange)selectedRange
{
    if (self.helpObject.supportEmoji == NO) {
        //表情檢查
        if ([HsUtil checkEmoji:markedText]) {
            return @"";
        }
    }
    return markedText;
}

- (void)textFiledEditChanged
{
    if (self.helpObject.maxLength != 0) {
        NSInteger kmaxLength = self.helpObject.maxLength;
        NSString *toBeString = self.helpObject.text;
        //截取長度
        if (toBeString.length > kmaxLength) {
            self.helpObject.text = [toBeString substringToIndex:kmaxLength];
        }
    }
    
    if ([self.delegate respondsToSelector:@selector(userTextFieldEditChanged:)]) {
        [self.delegate userTextFieldEditChanged:self.helpObject];
    }
}

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
    //emoji表情校驗
    
    if (self.helpObject.supportEmoji == NO && string.length != 0) {
        if ([self nowIsEmojiKeyBorad] == YES) {
            return NO;
        }
    }
    
    //長度校驗
    if (self.helpObject.maxLength != 0 && string.length != 0) {
        NSString *toBeString = [textField.text stringByReplacingCharactersInRange:range withString:string];
        NSInteger kmaxLength = self.helpObject.maxLength;
        if (toBeString.length > kmaxLength){
            return NO;
        }
    }
    
    if ([self.delegate respondsToSelector:@selector(userTextField:shouldChangeCharactersInRange:replacementString:)]) {
        return [self.delegate userTextField:self.helpObject shouldChangeCharactersInRange:range replacementString:string];
    }
    
    return YES;
}

- (void)textFieldDidEndEditing:(UITextField *)textField
{
    if ([self.delegate respondsToSelector:@selector(userTextFieldDidEndEditing:)]) {
        [self.delegate userTextFieldDidEndEditing:self.helpObject];
    }
}

- (void)textFieldDidBeginEditing:(UITextField *)textField
{
    if ([self.delegate respondsToSelector:@selector(userTextField:textFieldDidBeginEditing:)]) {
        [self.delegate userTextFieldDidBeginEditing:self.helpObject];
    }
}

@end

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,349評論 25 708
  • 發現 關注 消息 iOS 第三方庫、插件、知名博客總結 作者大灰狼的小綿羊哥哥關注 2017.06.26 09:4...
    肇東周閱讀 12,245評論 4 61
  • 懶惰是現在孩子普遍的現象,其實孩子小的時候他是非常勤快的,比如看到媽媽擦桌子,他也會模仿,而且會把它當成快樂的事,...
    山水青清閱讀 615評論 0 0
  • 看了一篇,講的是小米某某新品發布會上三款產品,策劃寫錯成“小米新品新品發布會”,作者靈機一動改成“小米新品新品新品...
    小小洋閱讀 185評論 0 0