MJAutoComplete 1.1.1

MJAutoComplete 1.1.1

测试已测试
语言语言 Obj-CObjective C
许可证 MIT
发布最后发布2015年7月

mazyod 维护。




  • 作者:
  • Mazyad Alabduljaleel

为在 iOS 中使用自动完成组件而设计的简单组件。它附带了一个简单的示例应用程序,应该可以帮助您迅速开始!

demo-picture

概要

如何使用

  • 以您喜欢的任何方式获取仓库。我支持子模块,但你也可以使用你喜欢的任何方法。
  • 将位于仓库中的 MJAutoComplete 文件夹添加到您的项目中。
  • 编写一些代码!!
    • #import "MJAutoCompleteManager.h"
    • 实例化管理器的一个实例,并分配代理和可选的数据源。
    • 代理必须实现协议中的一个 shouldUpdateText 方法。
    • 实例化几个 MJAutoCompleteTriggers,包含分隔符和项目列表(用于测试)。
    • 将触发器添加到 MJAutoCompleteManager 实例。
    • 当您准备好自动完成组件的容器视图时,将 MJAutoCompleteManagercontainer 属性分配给该容器。
    • 最后,使用 -[MJAutoCompleteManager processString:] 发送您要处理的字符串!

如何工作

术语

  • 管理器:管理自动完成组件的顶级对象。
  • 触发器:定义应该显示自动完成列表的分隔符,可选地还有列表本身和一个自定义的 UITableViewCell 子类。
  • 项目:定义单个自动完成选项。除了任意上下文的 NSDictionary 属性外,还有两个有趣的属性
    • autoCompleteString:在筛选列表时要检查的字符串
    • displayedString:用户在默认的 MJAutoCompleteCell 实现中看到的字符串。(例如:autoCompleteString = 推特用户名,displayedString = 全名)。

配置

您主要与之交互的最顶级对象是 MJAutoCompleteManager。该管理器保留一个 TableViewController 并要求您将其 container 分配给将托管自动完成表格视图的 UIView。管理器还提供代理 & 数据源接口以与组件交互。

处理输入

向自动完成管理器发送输入

初始化后,您需要通过 processString: 将用户正在键入的整个字符串发送到自动完成管理器。管理器将遍历触发器并检查输入是否启动了它们之一。

在触发布自动完成触发器后

如果输入触发了触发器,管理器将检查数据源是否实现了 itemList: 选择器。此方法是为计划异步获取列表的开发者而设计的。此选择器在列表就绪后必须调用回调。如果没有实现此方法,则开发人员必须在触发器上设置项目列表(trigger.autoCompleteItemList)。

在此之前,管理器获得触发器的结果后,会向数据源发送另一个可选消息来就地过滤列表。(即传递 NSMutableArray 到数据源,并在返回时期望该对象包含过滤后的列表)。如果数据源没有实现此方法,则管理器将对列表应用默认过滤器(例如,autoCompleteString beginswith[cd] %@)。

最后,向代理发送一个可选消息,表示自动完成表格视图将出现。

实际上,每当用户键入更多内容时,此过程都会发生,即使自动完成表格已显示也是如此。这允许开发人员实现诸如自动纠正之类的启发式方法。

显示项目

MJAutoCompleteTC(其中的 TC 表示 TableViewController)只需从池中提取一个可重用的单元格并将其分配给该行的 MJAutoCompleteItem,在将其返回给表格视图之前。控制器将向管理器发送消息,然后管理器再次调用委托的任意选择器 autoCompleteManager:willPresentCell:forTrigger:。这是为开发人员打算在单元格出现时加载数据而设计的(例如,头像)。

选择自动完成选项

在此阶段,用户可能会输入使自动完成表格消失的字符,例如空白字符,或者选择自动完成选项(或退出应用程序,或应用程序崩溃等)。如果他们选择了一个选项,则唯一必需的 MJAutoCompleteManagerDelegate 方法被调用,该方法为 -[autoCompleteManager:shouldUpdateToText:]。此方法的实现通常是设置管理器传递的字符串作为用户正在键入的组件的新字符串。

注意事项 重要的!

  • 在向组件发送自动完成项目列表时,请确保它是一个 MJAutoCompleteItem 的数组!!如果需要,请使用 [MJAutoCompleteItem autoCompleteCellModelFromStrings:myObjectArray]。这将通过将 -[NSObject description] 消息传递到数组中的所有项目来返回 MJAutoCompleteItem 数组。

  • 如果您想为该组件使用自定义的 MJAutoCompleteCell 子类,请确保

    • 在从 nib 文件加载时,将 nib 中的重用标识符设置为子类名称。
    • 将子类字符串分配给相应的触发器,它将尝试加载一个 nib,如果找不到,将简单地使用以下命令将类注册到 tableView 中:-[UITableView registerClass:NSClassFromString(...) ...]

演示讲解

建设中

依赖项

  • .

挑战

缩略图支持

问题

在默认的非常简单的实现后,该实现允许开发者懒加载缩略图并将它们缓存在其端,我意识到大多数现有 iOS 异步图像加载组件都是 UIImageView 分类。这意味着,提供给开发者一个具有图像属性的模型对象将不兼容这些组件。我考虑在项目中嵌入一个组件,如臭名昭著的 SDWebImage,但这意味着组件将会有一个不同的内部缓存,我必须将其公开给开发者,或者以某种方式允许开发者管理/禁用。

解决方案

最终的适应解决方案是 completely 移除缩略图支持。相反,实现了一个功能,允许开发者子类化 MJAutoCompleteCell,从而可以根据自己的需求定制单元格。采取这种方法的背后原因是因为我来自一个支持细粒度可维护/可替换组件而不是一个巨大的单体组件,该组件仅仅试图做所有事情的学派。

特别感谢

  • 用于演示目的的卓越的 Haneke
  • alltheragefaces.com,想象如果没有这些服务我们的例子会是多么糟糕。