UITexifield输入增加实时搜索

接到任务

虽然做了很多次UISearchbar的搜索,但是这次产品让加一个在输入框下面出一个弹窗能够实现实时搜索功能,并且每次联想3条内容,下面无遮挡,效果类似淘宝的发票页面:


输入联想

Tips:
千万不要小看实时搜索,暴力测试的时候,一秒钟输入十个字符,调十次接口的话,会被服务端暴打 ( ´▽`) 别问我怎么知道
这里可以利用栈的思想,取到栈顶内容,就可以退出了,这样能节省不少服务器资源

想法

看了下样式之后,脑子里面想了几分钟,就决定先写个manager,接受UITextFieldDelegate的响应,然后调用查询接口,取前3个返回值后,根据textfield的位置,添加一个tableview,自己处理相关event。

注意点

上面提到了,如果什么处理都不做,直接监听UIControlEventEditingChanged,会带来几个问题

  • 在输入过程中,输入法会自己在toolbar上有联想,点击联想内容后没有响应
  • 输入过快,调用接口过于频繁,造成资源浪费

第一点,比较好处理,delegate回调中判断 · textField.markedTextRange == nil就可以

第二点,需要着手做两手准备

  • 从根源上处理,在每次输入变化的时候,先取消上一次搜索操作,然后做一个延时操作
    [NSObject cancelPreviousPerformRequestsWithTarget:self];
    [self performSelector:@selector(doSomething:) withObject:textField.text afterDelay:0.5];
    
    这样可以初步避免每一次text变化都会出发搜索,只有当输入暂停 的时候,才会触发操作
  • 第二点,记录每次搜索内容,防止出现虽然取消了上次操作,但是接口已经返回了而此时又有了新的输入,造成tebleview不断刷新,如果当前block返回的内容是最后一次输入的,才会刷新。我这边是在搜索结果返回触发tableview的时候,判断一下当前持有的context是否是最后一次搜索的,如果是的话才会加载tableview,否则就直接不加载了。
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。