美文网首页iOS DeveloperiOS开发资料收集区iOS
iOS - 自定义UITextField类设计与实现

iOS - 自定义UITextField类设计与实现

作者: 程序员咿呀咿呀哟 | 来源:发表于2016-05-10 17:46 被阅读1626次

    现在讲一下自定义的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
    
    

    相关文章

      网友评论

        本文标题:iOS - 自定义UITextField类设计与实现

        本文链接:https://www.haomeiwen.com/subject/nzyyrttx.html