用UITextField做模糊搜索

背景

在项目中有一个界面需要选择银行,可是银行太多,用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];
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容