用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];
}

你可能感兴趣的:(用UITextField做模糊搜索)