为在 iOS 中使用自动完成组件而设计的简单组件。它附带了一个简单的示例应用程序,应该可以帮助您迅速开始!
MJAutoComplete
文件夹添加到您的项目中。#import "MJAutoCompleteManager.h"
shouldUpdateText
方法。MJAutoCompleteTriggers
,包含分隔符和项目列表(用于测试)。MJAutoCompleteManager
实例。MJAutoCompleteManager
的 container
属性分配给该容器。-[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
子类,请确保
-[UITableView registerClass:NSClassFromString(...) ...]
。在默认的非常简单的实现后,该实现允许开发者懒加载缩略图并将它们缓存在其端,我意识到大多数现有 iOS 异步图像加载组件都是 UIImageView
分类。这意味着,提供给开发者一个具有图像属性的模型对象将不兼容这些组件。我考虑在项目中嵌入一个组件,如臭名昭著的 SDWebImage,但这意味着组件将会有一个不同的内部缓存,我必须将其公开给开发者,或者以某种方式允许开发者管理/禁用。
最终的适应解决方案是 completely 移除缩略图支持。相反,实现了一个功能,允许开发者子类化 MJAutoCompleteCell
,从而可以根据自己的需求定制单元格。采取这种方法的背后原因是因为我来自一个支持细粒度可维护/可替换组件而不是一个巨大的单体组件,该组件仅仅试图做所有事情的学派。