UITextField-邮箱后缀联想匹配

最近做项目,有一个功能,百度了一下 结果没有 就研究了一下。

当用户输入邮箱形式的账号时,输入完“@”符号后,联想出常用的邮箱

点击某一行,将改行代表邮箱自动输入到账号输入框内

如果控件属性不懂或者不认识 ,请百度!

说一下原理,首先我们要判断输入的是否是“@”,之后在在进行范围截取,最后匹配

- (BOOL)hasPrefix:(NSString *)aString //系统 已经提供了匹配方法,用不着正则!  
 直接上代码!

#import "UserLoginViewController.h"

@interface
UserLoginViewController ()<UITextFieldDelegate,UITableViewDataSource,UITableViewDelegate>

{

BOOL _showList;

}

@property (nonatomic)
UITextField *accountTextField;

@property (nonatomic)
UITableView *listTableView;

@property (nonatomic)
NSArray *emalArray;
//邮箱后缀

@property (nonatomic)
NSMutableArray *tabviewData;
//服务器数据

- (void)dealloc

{

[self
unregisterNotifications];

}

- (void)viewDidLoad {

[super
viewDidLoad];

[self
registerNotifications];

_showList = NO;//默认不显示

self.emalArray = [[NSArray alloc] initWithObjects:@"sohu.com",@"sina.com",@"sina.cn",@"163.com",@"126.com",@"qq.com",@"hotmail.com",@"gmail.com", nil];

self.tabviewData = [NSMutableArray array];

_accountTextField= [self
createLoginField:@"手机号/用户名/邮箱/"];
 //此处自定义控件  不会请百度

_accountTextField.frame =
CGRectMake(0,
0,220,49);

[self.view addSubview:_accountTextField];

//下拉列表

_listTableView = [[UITableView
alloc]initWithFrame:

CGRectMake(0,0,280,120)];

_listTableView.top =
50;

_listTableView.left =
20;

_listTableView.dataSource=self;

_listTableView.delegate=self;

_listTableView.bounces =
NO;

_listTableView.backgroundColor= [UIColor
whiteColor];

_listTableView.separatorColor= [UIColor
lightGrayColor];

_listTableView.hidden=!_showList;//一开始listView是隐藏的,此后根据showList的值显示或隐藏

[self.view
addSubview:_listTableView];

// Do any additional setup after loading the view.

}

-(BOOL)showList{//setShowList:No为隐藏,setShowList:Yes为显示

return
_showList;

}

-(void)setShowList:(BOOL)iShow{

_showList=iShow;

_listTableView.hidden=!iShow;

}

核心代码

#pragma mark UITextFieldDelegate

- (BOOL)textFieldShouldReturn:(UITextField *)textField

{

[[[UIApplication
sharedApplication] keyWindow]
endEditing:YES];

return
YES;

}

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range
replacementString:(NSString *)string

{

//判断text
是否输入过@ 如果输入过则不出现下啦菜单

NSString *text = [textField.text
stringByReplacingCharactersInRange:range
withString:string];

if (textField ==_accountTextField) {

//是否包含@

if ([text containsString:@"@"]) {

[self
setShowList:YES];

[self.tabviewData
removeAllObjects];

//范围

NSRange range = [text
rangeOfString:@"@"];

if ((range.location + range.length) == text.length) {

for (NSString *str
in self.emalArray) {

[self.tabviewData
addObject:[NSString
stringWithFormat:@"%@%@",text,str]];

}

}else{

NSString *suffix = [text
substringWithRange:NSMakeRange(range.location+range.length, text.length-(range.location+range.length))];

NSString *headText = [text
substringWithRange:NSMakeRange(0,range.location+range.length)];

for (NSString *str
in self.emalArray) {

//匹配

if ([str hasPrefix:suffix]) {

[self.tabviewData
addObject:[NSString
stringWithFormat:@"%@%@",headText,str]];

}

}

if (self.tabviewData.count<=0) {

[self
setShowList:NO];

}

}

[self.listTableView
reloadData];

}else

{

[self
setShowList:NO];

}

}

return
YES;

}

- (BOOL)textFieldShouldClear:(UITextField *)textField

{

//返回一个BOOL值指明是否允许根据用户请求清除内容

//可以设置在特定条件下才允许清除内容

[self
setShowList:NO];

return
YES;

}

#pragma  mark 监听键盘

- (void)registerNotifications

{

[[NSNotificationCenter
defaultCenter]addObserver:self
selector:@selector(textFiledEditChanged:)

name:@"UITextFieldTextDidChangeNotification"

object:nil];

}

- (void)unregisterNotifications

{

//移除通知

[[NSNotificationCenter
defaultCenter]removeObserver:self];

}

- (void)textFiledEditChanged:(NSNotification *)obj

{

//此处可以拿到 正在输入的值 做一些处理

}

#pragma mark listViewdataSource method and delegate method

-(NSInteger)tableView:(UITableView *)table numberOfRowsInSection:(NSInteger)section{

return
self.tabviewData.count;

}

-(UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath
*)indexPath{

static NSString *cellid=@"listviewid";

UITableViewCell* cell=[tableView
dequeueReusableCellWithIdentifier:cellid];

if(cell==nil){

cell=[[UITableViewCell
alloc]initWithStyle:UITableViewCellStyleDefault

reuseIdentifier:cellid];

cell.layer.borderColor = [UIColor
grayColor].CGColor;

cell.layer.borderWidth =
1;

}

cell.textLabel.frame =
CGRectMake(0,
0, 220,
40);

cell.textLabel.text = [self.tabviewData
objectAtIndex:indexPath.row];

cell.textLabel.font =
_accountTextField.font;

return cell;

}

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath
*)indexPath

{

return
40;

}

//当选择下拉列表中的一行时,设置文本框中的值,隐藏下拉列表

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath
*)indexPath

{

//显示值

NSString *string = [self.tabviewData
objectAtIndex:indexPath.row];

_accountTextField.text = string;

[self
setShowList:NO];

}

时间: 2024-10-10 08:21:03

UITextField-邮箱后缀联想匹配的相关文章

IOS-UITextField-邮箱后缀联想赛

最近做的项目,有一个函数,百度了一下 结果没 要研究了一下. 当用户输入邮箱形式的账号时,输入完"@"符号后.联想出经常使用的邮箱 点击某一行,将改行代表邮箱自己主动输入到账号输入框内 假设控件属性不懂或者不认识 ,请百度! 说一下原理.首先我们要推断输入的是否是"@".之后在在进行范围截取,最后匹配 - (BOOL)hasPrefix:(NSString *)aString //系统 已经提供了匹配方法,用不着正则!    直接上代码! #import &quo

用面向对象解决 输入用户名自动显示邮箱后缀列表的方法

---恢复内容开始--- 当我们注册或者登录要用邮箱格式时会显示邮箱后缀的提示下拉框 效果如图所示 主要介绍了JS输入用户名自动显示邮箱后缀列表的方法,可实现自动显示邮箱后缀名列表的功能, 原理是:一个输入框 当我输入任何字的时候 自动下拉相应的邮箱提示,在输入框输入11的时候 下拉框有所有11的邮箱 输入其他的时候 有其他文案对应的邮箱. 同理 此插件不需要任何html标签,只需要一个输入框 有相对应的id类名就ok 且父级有个class类名,其他的都不需要.内部的HTML代码都是自动生成的

基于jquery的邮箱输入联想插件开发

js代码: /*create by code_bunny 20140701 [email protected] https://github.com/OOP-Code-Bunny */ (function ($) { $.fn.autoComplate = function (opts) { this.each(function () { init.call(this, opts); }); return this; }; function init(opts) { var defaultOpt

邮箱后缀自动联想

借用人家的插件加上自己处理的兼容: 1.$.support.msie 是判断浏览器兼容方法  jQ9取消了$.support 2.input  propertychange(ie专属) 有兼容问题 可以用keyup事件代替(无需兼容) 代码:html <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transiti

jquery仿邮箱文本输入框自动加载邮箱后缀

在像百度这样的网站注册时,你会看到输入邮箱会出现自动给用户输入补全主流邮箱.这种对于增加用户体验的小例子已司空见惯.正好看到人家写的这种js功能.还挺不错,使用起来很方便,几乎不用写神呢代码."傻瓜式式的"拿来主义"就行了. js: /** * 邮箱自动提示插件 * @constructor EmailAutoComplete * @ options {object} 可配置项 */ function EmailAutoComplete(options) { this.con

基于jQuery的input输入框下拉提示层(自动邮箱后缀名)

基于jQuery的input输入框下拉提示层,方便用户输入邮箱时的提示信息,需要的朋友可以参考下 效果图 // JavaScript Document (function($){ $.fn.extend({ "changeTips":function(value){ value = $.extend({ divTip:"" },value) var $this = $(this); var indexLi = 0; //点击document隐藏下拉层 $(docum

生成随机密码和邮箱、手机匹配

package com.alibaba.uyuni.common.util; import java.util.Random; public class GeneratePassword {     /**      * 生成随机密码      * @param pwd_len      * 生成的密码的总长度      * @return 密码的字符串      */     public static String genRandomNum(int pwd_len) {         //

文本框输入邮箱自动联想补全

<!DOCTYPE html> <html> <head> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> <meta http-equiv="content-type" content="text/html;charset=utf-8"> <title></title&g

js中邮箱的正则匹配

能用于 普遍的邮箱! js 代码如下: function is_Email(str){    var reg = /^(\w)+(\.\w+)*@(\w)+((\.\w+)+)$/;    return reg.test(str); } function check_email(){    var email = $("#email").val();    var email_length = email.length;     if(is_Email(email)){