服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - IOS - IOS实现邮箱模糊匹配的功能

IOS实现邮箱模糊匹配的功能

2021-01-25 15:51iOS开发网 IOS

在一些App的订单填写页,输入用户邮箱有个提示邮箱后缀的功能,很好用!还可以根据各个邮箱类型用户量来做一个优先级的匹配哦。这个功能该如何实现呢,下面来一起看看。

先来看看要实现的效果图

IOS实现邮箱模糊匹配的功能

一.介绍一下功能

当输入一个邮箱的数字,会默认在后面匹配出来@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.hxltextfield.m,切记不要忘了将textfield.delegate设置给viewcontroller,textfield样式可在xib自行设置,匹配的邮箱区域颜色可自行设置,然后在代码中只需要调api

?
1
2
3
4
5
6
/**
*
*1.通过xib创建只需要赋值此参数即可
*@param mailtypearray邮箱匹配类型
*
*/@property(nonatomic,strong)nsmutablearray*mailtypearray;

示例代码:

?
1
self.textfield.mailtypearray= [nsmutablearrayarraywithobjects:@"@qq.com",@"@163.com",@"@126.com",@"@yahoo.com",@"@139.com",@"@henu.com",nil];

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

?
1
2
3
/**
*optional匹配的邮箱类型后缀默认是rgb为170 170 170的颜色,可自行设置
*/@property(nonatomic,strong)uicolor* mailmatchcolor;

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

?
1
2
3
4
5
6
7
8
/**
*2.通过手写创建textfield时候调用
*
*@param frameframe大小
*@param fontsize textfield大小
*
*@return self
*/- (instancetype)initwithframe:(cgrect)frame fontsize:(cgfloat)fontsize;

示例代码:

?
1
2
3
4
5
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.mailmatchcolor = [uicolor redcolor]; 可选属性
[self.view addsubview:field];

我在示例程序中只针对xib的textfield写了手势关闭,结束textfield的输入操作,手洞创建textfield没有写结束第一响应者的操作。如果你在实际使用中,可以根据你的需求例如点击键盘的完成按钮,或者触摸屏幕的view等场景下结束textfield的键盘第一响应者,从而取textfield的text进行额外的需求操作。

可根据自己需求定制自己的frame,font大小。不过不支持initnew初始化方法,即使用了也没关系,会有一个温馨的报错提示

?
1
- (instancetype)init__attribute__((unavailable("init方法不可用,请用initwithname:fontszie:")));+ (instancetype)new__attribute__((unavailable("init方法不可用,请用initwithname:fontszie:")));

三.介绍一下实现原理

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作为我们最终的结果。

下面贴上匹配邮箱过程的关键代码,并且每行都有注释。

?
1
2
3
4
5
6
7
8
9
10
11
12
/**
*匹配邮箱过程
*
*@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的attributensmutableattributedstring*attributestring = [[nsmutableattributedstringalloc]initwithstring:[nsstringstringwithformat:@"%@%@",emailstring,fixstr]];
 
[attributestringaddattribute:nsforegroundcolorattributenamevalue:[uicolorclearcolor]range:nsmakerange(0,cutlenth)];self.maillabel.attributedtext= attributestring;//清空文本框内容时隐藏lblemailif(completestr.length==0){self.maillabel.text=@"";self.email=@"";
}
}

四、总结

以上就是ios实现邮箱模糊匹配功能的全部功能,实现后是不是很好用呢?感兴趣的快快动手实践起来,希望对大家的学习或者工作能有所帮助。

延伸 · 阅读

精彩推荐
  • IOSiOS中tableview 两级cell的展开与收回的示例代码

    iOS中tableview 两级cell的展开与收回的示例代码

    本篇文章主要介绍了iOS中tableview 两级cell的展开与收回的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    J_Kang3862021-04-22
  • IOSiOS布局渲染之UIView方法的调用时机详解

    iOS布局渲染之UIView方法的调用时机详解

    在你刚开始开发 iOS 应用时,最难避免或者是调试的就是和布局相关的问题,下面这篇文章主要给大家介绍了关于iOS布局渲染之UIView方法调用时机的相关资料...

    windtersharp7642021-05-04
  • IOS解析iOS开发中的FirstResponder第一响应对象

    解析iOS开发中的FirstResponder第一响应对象

    这篇文章主要介绍了解析iOS开发中的FirstResponder第一响应对象,包括View的FirstResponder的释放问题,需要的朋友可以参考下...

    一片枫叶4662020-12-25
  • IOSIOS开发之字典转字符串的实例详解

    IOS开发之字典转字符串的实例详解

    这篇文章主要介绍了IOS开发之字典转字符串的实例详解的相关资料,希望通过本文能帮助到大家,让大家掌握这样的方法,需要的朋友可以参考下...

    苦练内功5832021-04-01
  • IOS关于iOS自适应cell行高的那些事儿

    关于iOS自适应cell行高的那些事儿

    这篇文章主要给大家介绍了关于iOS自适应cell行高的那些事儿,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的...

    daisy6092021-05-17
  • IOSiOS通过逆向理解Block的内存模型

    iOS通过逆向理解Block的内存模型

    自从对 iOS 的逆向初窥门径后,我也经常通过它来分析一些比较大的应用,参考一下这些应用中某些功能的实现。这个探索的过程乐趣多多,不仅能满足自...

    Swiftyper12832021-03-03
  • IOSIOS 屏幕适配方案实现缩放window的示例代码

    IOS 屏幕适配方案实现缩放window的示例代码

    这篇文章主要介绍了IOS 屏幕适配方案实现缩放window的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要...

    xiari5772021-06-01
  • IOSiOS 雷达效果实例详解

    iOS 雷达效果实例详解

    这篇文章主要介绍了iOS 雷达效果实例详解的相关资料,需要的朋友可以参考下...

    SimpleWorld11022021-01-28