前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >iOS UITextField 限制输入

iOS UITextField 限制输入

作者头像
赵哥窟
发布2019-01-28 16:40:48
发布2019-01-28 16:40:48
1.2K00
代码可运行
举报
文章被收录于专栏:日常技术分享日常技术分享
运行总次数:0
代码可运行

通常情况下如果要限制UITextField的输入长度或输入类型要么在回调方法判断

代码语言:javascript
代码运行次数:0
运行
复制
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string 
{
}

要么在监听里面判断

代码语言:javascript
代码运行次数:0
运行
复制
[self.phoneTextField addTarget:self action:@selector(textFieldDidChange:) forControlEvents:UIControlEventEditingChanged];

- (void)textFieldDidChange:(UITextField *)textField
{
}

但是如果很多页面的TextField控件需要验证这样写就很麻烦,为了不重复造轮子。写了一个Category。只实现了输入长度限制,输入数字,输入字母,如果不能满足需求可自行扩展。

代码语言:javascript
代码运行次数:0
运行
复制
#import <UIKit/UIKit.h>

typedef void(^TextLengthBlock)(NSInteger length);
typedef void(^IsTextFieldTypeBlock)(BOOL filedType);

typedef NS_ENUM(NSInteger,DTextFieldType) {
    DTextFieldStringTypeNone = 0,            // 不限制
    DTextFieldStringTypeNumber = 1,         // 数字
    DTextFieldStringTypeLetter = 2         // 字母
};

NS_ASSUME_NONNULL_BEGIN

@interface UITextField (Limit)

/**允许输入最大字符长度*/
@property (assign, nonatomic) NSInteger maxLength;
/**输入类型*/
@property (assign, nonatomic) NSInteger textFieldType;
/**输入长度回调(返回输入的字符长度)*/
@property (nonatomic , copy) TextLengthBlock lengthBlock;
/**输入限制类型的回调(判断是否是想要的输入类型,外部提示用)*/
@property (nonatomic , copy) IsTextFieldTypeBlock isTextFieldTypeBlock;


@end

NS_ASSUME_NONNULL_END
代码语言:javascript
代码运行次数:0
运行
复制
#import "UITextField+Limit.h"
#import <objc/runtime.h>

#define kDNUMBERS     @"0123456789\n"
#define kDLETTER     @"abcdefghijklmnopqresuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"

static NSString * const DMaxLengthKey = @"DMaxLengthKey";
static NSString * const DTextLengthBlockKey = @"DTextLengthKey";
static NSString * const DTextFieldTypeKey = @"DTextFieldTypeKey";
static NSString * const DIsTextFieldTypeKey = @"DIsTextFieldTypeKey";

@implementation UITextField (Limit)

- (void)setMaxLength:(NSInteger)maxLength{
    objc_setAssociatedObject(self, &DMaxLengthKey, @(maxLength), OBJC_ASSOCIATION_ASSIGN);
    
    [self addTarget:self
             action:@selector(textFieldTextChanged:)
   forControlEvents:UIControlEventEditingChanged];
}
- (NSInteger)maxLength{
    return   [objc_getAssociatedObject(self, &DMaxLengthKey) integerValue];
}

- (void)setLengthBlock:(TextLengthBlock)lengthBlock{
    objc_setAssociatedObject(self, &DTextLengthBlockKey, lengthBlock, OBJC_ASSOCIATION_COPY);
    
    [self addTarget:self
             action:@selector(textFieldTextChanged:)
   forControlEvents:UIControlEventEditingChanged];
}
- (TextLengthBlock)lengthBlock{
    return objc_getAssociatedObject(self, &DTextLengthBlockKey);
}

- (void)setTextFieldType:(NSInteger)textFieldType{
    objc_setAssociatedObject(self, &DTextFieldTypeKey,  @(textFieldType), OBJC_ASSOCIATION_ASSIGN);
}
- (NSInteger)textFieldType{
    return [objc_getAssociatedObject(self, &DTextFieldTypeKey) integerValue];
}

- (void)setIsTextFieldTypeBlock:(IsTextFieldTypeBlock)isTextFieldTypeBlock{
    objc_setAssociatedObject(self, &DIsTextFieldTypeKey, isTextFieldTypeBlock, OBJC_ASSOCIATION_COPY);
}
- (IsTextFieldTypeBlock)isTextFieldTypeBlock{
    return objc_getAssociatedObject(self, &DIsTextFieldTypeKey);
}

- (void)lengthLimitBlock:(UITextField *)textField
{
    if (self.lengthBlock) {
        self.lengthBlock(textField.text.length);
    }
}

- (void)textFieldTextChanged:(UITextField *)textField
{
   
    switch (self.textFieldType) {
        case DTextFieldStringTypeNone:
        {
            [self textFieldStringTypeNumber:textField];
        }
            break;
        case DTextFieldStringTypeNumber:
        {
            [self textFieldStringTypeNumber:textField];
        }
            break;
        case DTextFieldStringTypeLetter:
        {
            [self textFieldStringTypeLetter:textField];
        }
            break;
            
        default:
            break;
    }
    
   [self lengthLimitBlock:textField];
}


/**
 获取TextField输入范围
 @param textField textField
 @return 范围
 */
- (NSRange)getTextFieldRange:(UITextField *)textField
{
    NSInteger adaptedLength = textField.maxLength > 0? MIN(textField.text.length, textField.maxLength) : MIN(textField.text.length, MAXFLOAT);
    NSRange range = NSMakeRange(0, adaptedLength);
    
    return range;
}


/**
 输入类型验证

 @param aStr 输入字符串
 @param format 验证格式
 @return BOOL
 */
- (BOOL)inputTypeVerification:(NSString *)aStr format:(NSString *)format{
    NSCharacterSet* filterCS = [[NSCharacterSet characterSetWithCharactersInString:format] invertedSet];
    NSString *filterString = [[aStr componentsSeparatedByCharactersInSet:filterCS] componentsJoinedByString:@""];
    
    return [aStr isEqualToString:filterString];
}


/**
 无限制(可以输入任何类型)
 @param textField textField
 */
- (void)textFieldStringTypeNone:(UITextField *)textField
{
    textField.text = [textField.text substringWithRange:[self getTextFieldRange:textField]];
}

/**
 只能输入数字
 @param textField textField
 */
- (void)textFieldStringTypeNumber:(UITextField *)textField
{
    BOOL flag = [self inputTypeVerification:textField.text format:kDNUMBERS];
    if (flag){
        textField.text = [textField.text substringWithRange:[self getTextFieldRange:textField]];
        if (self.isTextFieldTypeBlock) {
            self.isTextFieldTypeBlock(YES);
        }
    }
    else{
        textField.text = @"";
        if (self.isTextFieldTypeBlock) {
            self.isTextFieldTypeBlock(NO);
        }
    }
}

/**
 只能输入字母
 @param textField textField
 */
- (void)textFieldStringTypeLetter:(UITextField *)textField
{
    BOOL flag = [self inputTypeVerification:textField.text format:kDLETTER];;
    if (flag){
        textField.text = [textField.text substringWithRange:[self getTextFieldRange:textField]];
        if (self.isTextFieldTypeBlock) {
            self.isTextFieldTypeBlock(YES);
        }
    }
    else{
        textField.text = @"";
        if (self.isTextFieldTypeBlock) {
            self.isTextFieldTypeBlock(NO);
        }
    }
}

@end

使用

代码语言:javascript
代码运行次数:0
运行
复制
self.textField1.textFieldType = DTextFieldStringTypeNumber;
    self.textField1.maxLength = 11;
    
    self.textField1.lengthBlock = ^(NSInteger length) {
        NSLog(@"长度--%zd",length);
    };
    self.textField1.isTextFieldTypeBlock = ^(BOOL filedType) {
        if (!filedType) {
            NSLog(@"请输入正确的类型");
        }
    };

Demo

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019.01.21 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档