背景
在项目中有一个界面需要选择银行,可是银行太多,用tableview下拉查找的话不方便用户使用,故需要实现在UITextField中输入时实现实时的本地银行名称搜索
误解
最开始我选择通过UITextField的
-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string;
控制,可是当拼音输入有未选择字符时此协议就会被调用,这样的话,调用太过频繁,且会使得谓词筛选条件不对,而我想实现的是在选中相应的中文时才调用搜索,就像UISearchController中的
- (void)updateSearchResultsForSearchController:(UISearchController *)searchController;
这个协议方法所实现的功能。
解决办法
选择给该textfield添加selector或者给textfield添加Notification监听 实现(我此处选择的是用selector),当不存在待选中字符时进行谓词过滤
[_bankField addTarget:self action:@selector(textFieldDidChanged:) forControlEvents:UIControlEventEditingChanged];
- (void)textFieldDidChanged:(UITextField *)textField {//此判断不能放在textfield的shouldChangeCharactersInRange协议方法中
UITextRange *markedTextRange = textField.markedTextRange;
//如果存在待选文字记录,则暂不处理 markedTextRange == nil说明不存在待选文字
if (markedTextRange == nil) {
[self selectBankList];
}
}
-(void)selectBankList{
NSPredicate *preicate = [NSPredicate predicateWithFormat:@"value CONTAINS[c] %@", self.bankField.text];//根据数组中元素字典的key为“value”对应的zh检索
if (self.selectedBankArr.count != 0) {
[self.selectedBankArr removeAllObjects];
}
//过滤数据
self.selectedBankArr= [NSMutableArray arrayWithArray:[self.bankListArr filteredArrayUsingPredicate:preicate]];
//刷新表格
[self.bankTableView reloadData];
}