現在講一下自定義的UITextField,這個類包含的功能暫時長度限制與emoji表情限制。主要講下設計思路,使得自定義的UITextField更具擴展易用性。
設計思路
- 用戶不需要操心基本功能的實現
- 肯定要具有原生UITextField的所有屬性方法。
- 控件獨立。
具體設計
首先自定義類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