美文网首页面试题
用UITextField做模糊搜索

用UITextField做模糊搜索

作者: 希达like | 来源:发表于2017-12-26 17:03 被阅读0次

    背景

    在项目中有一个界面需要选择银行,可是银行太多,用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做模糊搜索

        本文链接:https://www.haomeiwen.com/subject/lzjjgxtx.html