前言
之前要做一個類似微博那樣輸入郵箱登錄時出現(xiàn)相關(guān)聯(lián)的郵箱后綴提示恍飘,就是下面這種效果榨崩。
沒找到很好用的第三方庫,只能自己寫一個章母,花費了不少時間汽畴,現(xiàn)在貢獻出來嗡官,希望能夠幫到大家官还。
具體實現(xiàn)
首先察滑,實現(xiàn)郵箱下拉提示這個效果思路還是比較簡單明確的,就是一個監(jiān)聽textField的狀態(tài)蚪缀,每當用戶輸入或刪除文字時做出判斷秫逝,如果里面含有“@”,就顯示一個tableView询枚,并用NSPredicate過濾顯示相關(guān)后綴违帆,但具體實現(xiàn)封裝時還是費了一番功夫。
首先自定義一個UITextField的子類金蜀,將下拉提示的tableView作為它的一個屬性刷后,并且用這個TextField作為tableView的代理對象
.h文件
@interface AZXEmailTextField : UITextField
.m文件
@interface AZXEmailTextField ()<UITableViewDataSource, UITableViewDelegate>
// 郵箱下拉提示列表
@property (strong, nonatomic) UITableView *promptTableView;
先把最重要的初始化方法寫好,這里因為考慮到大家要面臨不同的情況渊抄,所以我讓開發(fā)者自己決定要把這個TextField加到那個View里面作為其超類尝胆,當然frame這個參數(shù)也是在那個View中的frame,至于setUpInView這個方法有點長我就不在這里貼出來了护桦,大家對具體實現(xiàn)感興趣的可以把源碼下載下來看一下
- (instancetype)initWithFrame:(CGRect)frame InView:(UIView *)view {
if (self = [super initWithFrame:frame]) {
return [self setUpInView:view];
}
return nil;
}
然后就是要監(jiān)聽用戶的改變textField文字的動作了含衔,這里有兩種方法,可以用UITextField的代理方法二庵,但是為了能把這個類盡量封裝的簡單點贪染,我使用的是另一種方法,直接監(jiān)聽其狀態(tài)的改變(注意催享,這里的self就是我自定義的那個AZXEmailTextField)
[self addTarget:self action:@selector(textFieldDidChanged) forControlEvents:UIControlEventEditingChanged];
下面就是實現(xiàn)提示相關(guān)后綴的功能了抑进,首先判斷,只要用戶已輸入“@”字符睡陪,就將下拉列表顯示出來(默認是hidden的),然后使用NSArray的filteredArrayUsingPredicate方法,過濾出匹配用戶輸入郵箱的提示
- (void)textFieldDidChanged {
if ([self.text containsString:@"@"]) {
self.promptTableView.hidden = NO;
// @后面的subString
NSString *latterStr = [self.text substringFromIndex:[self.text rangeOfString:@"@"].location+1];
if ([latterStr isEqualToString:@""]) {
self.matchedSuffixArray = self.emailSuffixArray;
} else {
self.matchedSuffixArray = [self.emailSuffixArray filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"self beginswith %@", [self deleteSpacesInString:latterStr]]];
if (self.matchedSuffixArray.count == 0) {
self.promptTableView.hidden = YES;
}
}
[self.promptTableView reloadData];
} else {
self.promptTableView.hidden = YES;
}
}
再然后兰迫,就是顯示下拉郵箱列表的具體樣式了信殊,考慮到大家具體的需求可能都不一樣,我留下許多API供大家高度的自定義下拉樣式汁果,比如下拉列表的高度涡拘,郵箱后綴的內(nèi)容,文字離列表左邊的距離据德,文字的字體大小顏色鳄乏,分割線的左右距離等等。如果想要上圖中的默認樣式效果棘利,那只要簡單的一句代碼就搞定了橱野,然后把它加到你想加的View里,剩余的都不用你操心善玫!
AZXEmailTextField *textField = [[AZXEmailTextField alloc] initWithFrame:frame InView:self.view];
源代碼在https://github.com/XinStar1/AZXEmailTextField
下載下來之后直接把“郵箱下拉提示”那個文件夾拖到項目里就可以了水援,這個demo是我認真花費了精力去寫的,希望可以幫到大家茅郎。如果覺得好用的話蜗元,可以給我一個star,當做對我的鼓勵系冗!