iOS邮箱模糊匹配功能集成

大家有些人应该遇到产品汪提过这样的需求,产品汪说:“某某App的订单填写页,输入用户邮箱有个提示邮箱后缀的功能,很好用啊!还可以根据各个邮箱类型用户量来做一个优先级的匹配哦。你可以不可以帮我实现哎!”这个做起来确实很烦的,产品汪是男的还可以拒绝掉,人家有啥功能你就做啥功能啊?但是如果是个漂亮的女产品汪,娇滴滴的来和你说~这个时候你能扛得住么?一不小心掉坑里了,答应了,一时爽快了。但是码代码就很蛋疼了,别怕,有我在,已经用一个自定义的textField全部集成好了~先看效果图。


邮箱匹配效果图.gif

一.介绍一下功能

当输入一个邮箱的数字,会默认在后面匹配出来@qq.com,当然这个默认@qq.com可以换成其他的如@163.com等等。这里默认是@qq.com,因为我们的产品汪做过统计大多数用户还是用的qq邮箱,所以默认是@qq.com。
当输入@符号还是不会有所变化,但是如果在@之后再输入字符,会将这个字符和你想要提示的邮箱后缀做匹配,我这里是需要匹配@qq.com,@163.com,@126.com,@yahoo.com,@139.com,@henu.com类型。例如:在@之后你输入了1,这个时候会在@1之后匹配出来63.com。接着,当你在@1之后又输入了2,会在@12后面匹配出来6.com。这些匹配的优先级是根据你给的需要匹配邮箱类型的顺序来的,并且这些想要匹配的邮箱类型也是完全可配的,可根据产品汪的需求作自己的定制。

二.说一下用法

1.先说一下如果你是在xib中想实现这个功能,首先要拖拽一个textField,设置好约束,然后让这个textField的类关联到XLTextField,当前前提你要下载并导入了XLTextField.h和XLTextField.m,切记不要忘了将textField.delegate设置给viewController,textField样式可在xib自行设置,匹配的邮箱区域颜色可自行设置,然后在代码中只需要调API

/**
*
*1.通过xib创建只需要赋值此参数即可
*@param mailTypeArray邮箱匹配类型
*
*/
@property(nonatomic,strong)NSMutableArray*mailTypeArray;

示例代码:

self.textField.mailTypeArray= [NSMutableArrayarrayWithObjects:@"@qq.com",@"@163.com",@"@126.com",@"@yahoo.com",@"@139.com",@"@henu.com",nil];
self.textField.didPressedReturnCompletion = ^(UITextField * textField){
      //点击return的回调,是可选的 根据自己需求使用
};

XLTextField.h还提供了一个可选的mailMatchColor属性这个属性是UIColor类型的,是匹配邮箱类型的颜色,可根据需求自行设置。

/**
*Optional匹配的邮箱类型后缀默认是RGB为170 170 170的颜色,可自行设置
*/
@property(nonatomic,strong)UIColor* mailMatchColor;

2.通过手动frame创建两个基本参数设置大小和字号,其他设置可额外自行设置,调用API

/**
*2.通过手写创建textField时候调用
*
*@param frameframe大小
*@param fontSize textField大小
*
*@return self
*/
- (instancetype)initWithFrame:(CGRect)frame fontSize:(CGFloat)fontSize;

示例代码:

XLTextField * field = [[XLTextField alloc] initWithFrame:CGRectMake(100, 200, 200, 30) fontSize:12];
field.placeholder = @"输入邮箱地址";
field.mailTypeArray = [NSMutableArray arrayWithObjects:@"@qq.com",@"@163.com",@"@126.com",@"@yahoo.com",@"@139.com",@"@henu.com", nil];
Field.didPressedReturnCompletion = ^(UITextField * textField){
      //点击return的回调,是可选的 根据自己需求使用
};
field.mailMatchColor = [UIColor redColor]; 可选属性
[self.view addSubview:field];

我在示例程序中只针对xib的textField写了手势关闭,结束textField的输入操作,手洞创建textField没有写结束第一响应者的操作。如果你在实际使用中,可以根据你的需求例如点击键盘的完成按钮,或者触摸屏幕的View等场景下结束textField的键盘第一响应者,从而取textField的text进行额外的需求操作。
可根据自己需求定制自己的frame,font大小。不过不支持init和new初始化方法,即使用了也没关系,会有一个温馨的报错提示

- (instancetype)init__attribute__((unavailable("init方法不可用,请用initWithName:fontSzie:")));
+ (instancetype)new__attribute__((unavailable("init方法不可用,请用initWithName:fontSzie:")));

更新版本内容:

如果接入的类需要在textField的代理方法中做操作 可实现对应的协议即可
@protocol XLEmailTextFieldDelegate <NSObject>

@optional
- (BOOL)XLTextFieldShouldBeginEditing:(UITextField *)textField;
- (void)XLTextFieldDidBeginEditing:(UITextField *)textField;
- (void)XLTextFieldDidEndEditing:(UITextField *)textField;
- (BOOL)XLTextField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string;
- (BOOL)XLTextFieldShouldReturn:(UITextField *)textField;

@end

三.介绍一下实现原理

1.可能你不看源码,就认为是一个textField实现了全部功能,其实No.我这里是配合了一个Label,在xib实现时利用aulayout手动添加Label。textField只是用来让用户输入,Label用来存储匹配之后的邮箱(邮箱号码+邮箱类型),并且展示。你看到的其实是Label的text内容。当最后结束编辑的时候,Label会将内容复制给textField的text,然后清空Label。Label只是在这里提一下实现方式,真正使用的值还是通过textField.text拿到的值。在这里你可能会吐槽,为什么不用一个textField呢,多简单省事。但是事实是我尝试过一个textField,中间遇到了一个坑,好像是textField一个bug,暂且这样说 因为当时确实是很奇葩的问题,具体是那么也忘记了,这里也不展开说了,有兴趣你可以用一个textField来尝试一下哈。

2.textField的代理方法全部封装在textField.m内部,在内部已经处理了这些代理,更加方便他人调用,不用再花很多心思在调试textField的代理方法上。不论是用xib还是用手动代码创建,都不需要设置textField.delegate给控制器。

3.在textField的shouldChangeCharactersInRange代理方法中针对你输入的每一个字符进行邮箱的匹配,下面会有这一块的完整代码。在textFieldDidEndEditing代理方法中将Label的值赋值给textField.text,然后将Label.text清空,直接取textField.text作为我们最终的结果。

下面贴上匹配邮箱过程的关键代码,并且每行都有注释,如果想要看更多源码欢迎在点击下载源码,查看所有源码。

/**
*匹配邮箱过程
*
*@param rangerange
*@param string用户输入string
*/

- (void)configMailMatchingRange:(NSRange)range replacementString:(NSString*)string
{
//获取完整的输入文本
NSString*completeStr = [self.textstringByReplacingCharactersInRange:rangewithString:string];

//以@符号分割文本
NSArray*temailArray = [completeStrcomponentsSeparatedByString:@"@"];

//获取邮箱前缀
NSString*emailString = [temailArrayfirstObject];

//邮箱匹配没有输入@符号时用@匹配
NSString*matchString =@"@";
if(temailArray.count>1){
//如果已经输入@符号截取@符号以后的字符串作为匹配字符串
matchString = [completeStrsubstringFromIndex:emailString.length];
}

//匹配邮箱得到所有跟当前输入匹配的邮箱后缀
NSMutableArray*suffixArray = [selfcheckEmailStr:matchString];

//边界控制如果没有跟当前输入匹配的后缀置为@""
NSString*fixStr = suffixArray.count>0? [suffixArrayfirstObject] :@"";

//将lblEmail部分字段隐藏
NSIntegercutLenth = suffixArray.count>0? completeStr.length: emailString.length;

//最终的邮箱地址
self.email= fixStr.length>0? [NSStringstringWithFormat:@"%@%@",emailString,fixStr] : completeStr;

//设置lblEmail的attribute
NSMutableAttributedString*attributeString = [[NSMutableAttributedStringalloc]initWithString:[NSStringstringWithFormat:@"%@%@",emailString,fixStr]];

[attributeStringaddAttribute:NSForegroundColorAttributeNamevalue:[UIColorclearColor]range:NSMakeRange(0,cutLenth)];

self.mailLabel.attributedText= attributeString;

//清空文本框内容时隐藏lblEmail
if(completeStr.length==0){
self.mailLabel.text=@"";
self.email=@"";
}
}

更新了文件,因为今天我在实际项目中又用到了邮箱匹配,不过因为是老项目,原来的基础上已经实现了textField的代理方法,并且有一些额外的操作,这个时候因为此textField代理是自己,所以代理方法是私有的,为了不影响之前的老代码,特意对外开放了textField的代理方法,也算是适配器模式的一种场景,改变接口即可复用老代码。可根据
自身需要去实现customDelegate。
如果你还喜欢,请留下一个Star,在这里先说声谢谢啦😍~
本人水平有限,如有纰漏指出欢迎指正!
如果您在使用中 有不能满足的需求~可以提出来 我做修改 尽量满足大家的需求。
在这里要感谢下@QYunFat,给的好的建议在点击return赋值textField,当时没考虑到这个,已添加😆
iOS 开发技术交流群号:529560119 ,提供各种最新权威学习书籍及开发视频

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,033评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,725评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,473评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,846评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,848评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,691评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,053评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,700评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,856评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,676评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,787评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,430评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,034评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,990评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,218评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,174评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,526评论 2 343

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,598评论 18 139
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,019评论 4 62
  • 他回来了,离家一个多月 再次回来 她看着他 有些许的陌生。 结婚几个月 她和他真正在一起的时间不超过一个月,他在八...
    君之语阅读 268评论 0 1
  • 别以为别人都在乎你 其实最在乎你的就是你自己 别总以为别人都在乎你 其实别人也都是只在乎自己 所以有时不必刻意伪装自己
    末时刻阅读 896评论 0 0
  • C语言中提供了三种逻辑运算符: &&(与运算)||(或运算)!(非运算) 逻辑运算的值 逻辑运算的值也为“真”和“...
    diveinljq阅读 749评论 0 0