"我们认为每个用户点击都会消耗他们的一点点能量和耐心。打字是这两种消耗中最大的之一。我们需要的是一个能够在尽可能少的键盘敲击下完成输入的文本字段,甚至对于非常长的单词也是一样。因此,MLPAutoCompleteTextField诞生了。"
MLPAutoCompleteTextField 是 UITextField 的一个子类,它的行为与典型的 UITextField 类似,只有一个显著的例外:它会根据用户输入动态管理一个自动完成建议的下拉表。其行为可能会让你联想到 Google 的自动完成搜索功能。从版本 1.3 开始,还支持将自动完成表作为键盘的附件视图显示。
用户需要在一个文本字段中输入一个长而复杂的化学名称。使用自动完成文本字段时,与用户输入的字符串密切匹配的化学名称可以随着输入显示出来,并且如果用户看到了她所想的化学名称,她可以选择它并将其自动输入到文本字段中。这减少了用户必须进行的打字量并有助于预防错误。所有这些都可以在单个视图中发生,而无需使用搜索表格视图控制器。
MLPAutoCompleteTextField 的目标是创建一个快速、易用的自动完成文本字段,同时可以高度定制。要获取一个可用的 MLPAutoCompleteTextField 实例,请确保您已经做了以下操作
将 MLPAutoCompleteTextField、NSString+Levenshtein、MLPAutoCompleteDataSource 和 MLPAutoCompleteTextFieldDelegate 文件添加到您的项目中(总共应有六个文件)。
在某个视图中分配和初始化 MLPAutoCompleteTextField 实例。
将文本字段的 "autoCompleteDataSource" 属性设置为实施所必需方法的 Valid 对象,并实现 MLPAutoCompleteTextFieldDataSource 协议。请注意,方法 "autoCompleteTextField:possibleCompletionsForString:" 是用于返回文本字段当前输入字符串的潜在完成的方法。此方法应返回一个 NSString 数组,或符合 MLPAutoCompletionObject 协议的对象数组,或两者的混合。此方法也是异步调用的。
(可选) 将文本框的 "autoCompleteDelegate" 属性设置为一个新的对象,该对象必须实现了 MLPAutoCompleteTextFieldDelegate 协议,以获得更多自定义选项。
此时应该已经有一个可以工作的 MLPAutoCompleteTextField 了。
从 MLPAutoCompleteTextField 的 1.3 版本开始,自多重建议可以被显示为一个表格视图,该视图出现在键盘上方。为了激活此功能,将 MLPAutoCompleteTextField 实例的 autoCompleteTableAppearsAsKeyboardAccessory
属性设置为 TRUE
。
传统上,你可能见过类似 MLPAutoCompleteTextField 使用类似于“搜索表格视图控制器”的实现。这种方法有一些局限性和样板代码,MLPAutoCompleteTextField 努力克服了这些问题。一个 MLPAutoCompleteTextField 并非用作搜索功能的替代品,它纯粹是为了快速字符串完成而设计。
MLPAutoCompleteTextField 对自多重字符串的排序是由由 Mark Aufflick 编写的 NSString+Levenshtein 类别扩展实现的,该类别扩展紧密基于 Rick Bourner 编写的 Levenshtein 算法。这个算法基本上计算两个字符串之间的编辑距离(即实现一个字符串到另一个字符串所需的更改次数)。
当数据源将一个字符串数组传递给 MLPAutoCompleteTextField 时,文本框会根据编辑距离对字符串进行排序,并显示这组自多重建议。
合理使用,我们希望 MLPAutoCompleteTextField 为所有起源和技能水平的开发者打开新的设计可能。
:D
MLPAutoCompleteTextField 使用多线程方法来对其自多重字符串进行排序,以确保主线程从未阻塞,UI 保持 100% 响应。
请注意,尽管你可以一次性将大量字符串(可能在千位数量级别)传递到 MLPAutoCompleteTextField 的数组中,但排序性能将直接受到你提供的字符串数量的影响。如果性能受到损害,你应该想尽办法减少在 MLPAutoCompleteTextField 请求时传递的字符串数量。(例如,如果你假设用户总是能正确知道单词的第一个字母,你可能会选择只发送以该字母或接近该字母开头的单词数组,而不是发送每个可能的单词)。
加权建议:在某些情况下,可能有多个自定义选择字符串都可以作为当前输入的不完整字符串的可能完成字符串。在当前的版本中,用户必须继续输入几个字符以进一步缩小自多重建议,将最可能的字符串浮到自动完成列表的顶部。
然而,在未来的版本中,你可以期待看到一种“加权”或“排名”系统,这允许你通过为它们分配一个数字来偏爱某些字符串。权重较高的字符串将出现在自动完成建议列表的上方。因此,即使一组字符串都是给定不完整字符串的可能完成字符串,那些具有更高权重的字符串被认为是最可能的匹配,并相应地进行排序。
这应该可以进一步减少用户必须输入的字符数。
字符串隐藏:如果一个自动补全建议质量如此之差,以至于与用户当前输入的字符串没有共同点,那么可能有一个内置选项不显示此建议。
标记加粗:如果用户输入了一个如“Grate White Sha”这样的字符串,并且有一个叫“Great White Shark”的自动补全建议,那么在这个建议中,“Great”这个词应该加粗,“White”应该正常显示,而“Shark”单词中的“rk”应该加粗。这更像Google的自动补全功能。(用户也可以选择反过来的行为)。
背景暗化:当自动补全表视图菜单打开时,应该有一个选项让父视图的背景稍微暗化,以保持文本框和自动补全建议的焦点。
MLPAutoCompleteTextField 使用 MIT 许可证
版权所有 (c) 2013, Mainloop LLC
任何人不得限制,免费获得本软件及其关联文档副本(“软件”),用于处理软件,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或销售软件的副本,并允许向软件提供者提供此类权限,前提是遵守以下条件:
上述版权声明和本许可协议应包含在软件的所有副本或实质部分中。
软件按“现状”提供,不提供任何明示或暗示的保证,包括但不限于对适销性、针对特定目的的适用性和非侵权的保证。在任何情况下,作者或版权所有者都不会因任何索赔、损害或其他责任(包括但不限于因合同、侵权或任何其他行为而产生的任何直接、间接、偶然、特殊、示范性或后果性损害),包括但不限于替代商品或服务的采购;使用、数据或利润损失;或业务中断),不论是由于使用此软件还是其他方式引起的,即使已通知此类损害的可能性也不承担责任。
NSString+Levenshtein 类别使用了此许可证,如 .h 和 .m 文件中所述
NSString+Levenshtein
版权所有 (c) 2009, Mark Aufflick 保留所有权利。
在满足以下条件的情况下,允许以源代码和二进制形式重新分发和使用,无论是否进行修改:
- 源代码重新分发必须保留上述版权声明、本条款和以下免责声明。
- 以二进制形式重新分发必须在该文档和/或其他材料中复制上述版权声明、本条款和以下免责声明,随分发提供。
- 不得未经明确事先书面许可将马克·奥夫利克的姓名或贡献者的姓名用于认可或推广源自本软件的产品。
此软件由马克·奥夫利克“现状”提供,并且明确或隐含的保证,包括但不限于适销性和针对特定目的的适用性的暗示保证,均予以弃权。在任何情况下,马克·奥夫利克都不会因任何直接、间接、偶然、特殊、示范性或后果性损害(包括但不限于替代商品或服务的采购;使用、数据或利润损失;或业务中断),无论是由于使用此软件还是其他方式引起的,即使已通知此类损害的可能性也不承担责任。
MLPAutoCompleteTextField 由 Mainloop LLC 的 Eddy Borja 编写。
NSString+Levenshtein 类别扩展由 Mark Aufflick 编写。
如果您使用的是 MLPAutoCompleteTextField,请告诉我们!欢迎在 [email protected] 留下评论、赞、恶评等。