美文网首页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