技术控

    今日:25| 主题:49195
收藏本版 (1)
最新软件应用技术尽在掌握

[其他] iOS邮箱模糊匹配功能集成

[复制链接]
甩的就是男人 发表于 2016-10-14 13:03:36
91 4

立即注册CoLaBug.com会员,免费获得投稿人的专业资料,享用更多功能,玩转个人品牌!

您需要 登录 才可以下载或查看,没有帐号?立即注册

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

  邮箱匹配效果图.gif
  一.介绍一下功能

  当输入一个邮箱的数字,[email protected][email protected]@[email protected][email protected]邮箱,[email protected]
  [email protected][email protected],会将这个字符和你想要提示的邮箱后缀做匹配,[email protected],@163.com,@126.com,@yahoo.com,@139.com,@henu.com类型。例如:[email protected][email protected][email protected][email protected]据你给的需要匹配邮箱类型的顺序来的,并且这些想要匹配的邮箱类型也是完全可配的,可根据产品汪的需求作自己的定制。
  二.说一下用法

  1.先说一下如果你是在xib中想实现这个功能,首先要拖拽一个textField,设置好约束,然后让这个textField的类关联到XLTextField,当前前提你要下载并导入了XLTextField.h和XLTextField.m,切记不要忘了将textField.delegate设置给viewController,textField样式可在xib自行设置,匹配的邮箱区域颜色可自行设置,然后在代码中只需要调API
  [code]/**
*
*1.通过xib创建只需要赋值此参数即可
[email protected] mailTypeArray邮箱匹配类型
*
[email protected](nonatomic,strong)NSMutableArray*mailTypeArray;[/code]  示例代码:
  [code]self.textField.mailTypeArray= [NSMutableArrayarrayWithObjects:@"@qq.com",@"@163.com",@"@126.com",@"@yahoo.com",@"@139.com",@"@henu.com",nil];
self.textField.didPressedReturnCompletion = ^(UITextField * textField){
      //点击return的回调,是可选的 根据自己需求使用
};[/code]  XLTextField.h还提供了一个可选的mailMatchColor属性这个属性是UIColor类型的,是匹配邮箱类型的颜色,可根据需求自行设置。
  [code]/**
*Optional匹配的邮箱类型后缀默认是RGB为170 170 170的颜色,可自行设置
*/
@property(nonatomic,strong)UIColor* mailMatchColor;[/code]  2.通过手动frame创建两个基本参数设置大小和字号,其他设置可额外自行设置,调用API
  [code]/**
*2.通过手写创建textField时候调用
*
[email protected] frameframe大小
[email protected] fontSize textField大小
*
[email protected] self
*/
- (instancetype)initWithFrame:(CGRect)frame fontSize:(CGFloat)fontSize;[/code]  示例代码:
  [code]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];[/code]  我在示例程序中只针对xib的textField写了手势关闭,结束textField的输入操作,手洞创建textField没有写结束第一响应者的操作。如果你在实际使用中,可以根据你的需求例如点击键盘的完成按钮,或者触摸屏幕的View等场景下结束textField的键盘第一响应者,从而取textField的text进行额外的需求操作。
  可根据自己需求定制自己的frame,font大小。不过不支持init和new初始化方法,即使用了也没关系,会有一个温馨的报错提示
  [code]- (instancetype)init__attribute__((unavailable("init方法不可用,请用initWithName:fontSzie:")));
+ (instancetype)new__attribute__((unavailable("init方法不可用,请用initWithName:fontSzie:")));[/code]  更新版本内容:
  [code]如果接入的类需要在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[/code]  三.介绍一下实现原理

  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作为我们最终的结果。
   下面贴上匹配邮箱过程的关键代码,并且每行都有注释,如果想要看更多源码欢迎在点击下载源码, 查看所有源码 。
  [code]/**
*匹配邮箱过程
*
[email protected] rangerange
[email protected] string用户输入string
*/

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

[email protected]
NSArray*temailArray = [completeStrcomponentsSeparatedByString:@"@"];

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

[email protected]@匹配
NSString*matchString =@"@";
if(temailArray.count>1){
[email protected]@符号以后的字符串作为匹配字符串
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=@"";
}
}[/code]  更新了文件,因为今天我在实际项目中又用到了邮箱匹配,不过因为是老项目,原来的基础上已经实现了textField的代理方法,并且有一些额外的操作,这个时候因为此textField代理是自己,所以代理方法是私有的,为了不影响之前的老代码,特意对外开放了textField的代理方法,也算是适配器模式的一种场景,改变接口即可复用老代码。可根据
  自身需要去实现customDelegate。
  如果你还喜欢,请留下一个Star,在这里先说声谢谢啦????~
  本人水平有限,如有纰漏指出欢迎指正!
  如果您在使用中 有不能满足的需求~可以提出来 我做修改 尽量满足大家的需求。
  [email protected],给的好的建议在点击return赋值textField,当时没考虑到这个,已添加????。
友荐云推荐




上一篇:让容器更安全、更有用
下一篇:Print sums of all subsets of a given set
酷辣虫提示酷辣虫禁止发表任何与中华人民共和国法律有抵触的内容!所有内容由用户发布,并不代表酷辣虫的观点,酷辣虫无法对用户发布内容真实性提供任何的保证,请自行验证并承担风险与后果。如您有版权、违规等问题,请通过"联系我们"或"违规举报"告知我们处理。

电商小吕哥 发表于 2016-10-18 05:39:08
不回就活不下去了啊!
回复 支持 反对

使用道具 举报

wei1991 发表于 2016-10-18 14:06:34
我最恨别人用鼠标指着我的头.
回复 支持 反对

使用道具 举报

董金 发表于 2016-10-19 14:37:08
在神经的人群里呆久了,我发现我正常了。
回复 支持 反对

使用道具 举报

空心印末夕情 发表于 2016-10-20 02:42:07
年轻的时候,我们常常冲着镜子做鬼脸;年老的时候,镜子算是扯平了.
回复 支持 反对

使用道具 举报

*滑动验证:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

我要投稿

推荐阅读

扫码访问 @iTTTTT瑞翔 的微博
回页顶回复上一篇下一篇回列表手机版
手机版/CoLaBug.com ( 粤ICP备05003221号 | 文网文[2010]257号 )|网站地图 酷辣虫

© 2001-2016 Comsenz Inc. Design: Dean. DiscuzFans.

返回顶部 返回列表