TokenRow
由 Xmartlabs SRL 提供。
内容
简介
TokenRow是Eureka的行扩展。它包含一个CLTokenInputView,允许用户选择、添加和删除标记。
TokenRow包含两个具有类似功能但显示方式不同的行
- TokenAccessoryRow:显示为单元格的`inputAccessoryView`的集合视图。用户可以水平滚动来选择所需的标记
- TokenTableRow:直接在单元格下方显示一个`UITableView`,供用户选择所需的选项。
使用方法
form +++ Section()
<<< TokenAccessoryRow<String>() {
$0.placeholder = "Choose from collection view"
$0.options = ["Peter Schmeichel", "David de Gea", "Oliver Kahn", "Fabien Barthez", "Tim Howard", "Gianluigi Buffon"]
}
+++ Section()
<<< TokenTableRow<String>() {
$0.placeholder = "Choose from table"
$0.options = ["Peter Schmeichel", "David de Gea", "Oliver Kahn", "Fabien Barthez", "Tim Howard", "Gianluigi Buffon"]
}
要了解您可以定制的内容,请查看定制化部分。
依赖项
- Eureka 5.x
- CLTokenInputView,这是一个标记视图组件
要求
- iOS 9.3+
- Xcode 10.2+
参与贡献
在贡献力量之前,请查阅CONTRIBUTING文件以获取更多信息。
如果您在应用中使用了TokenRow,我们很乐意听到您的反馈!在twitter上联系我们。
示例
按照以下步骤运行示例项目
- 克隆TokenRow仓库
- 在
TokenRow/Example
文件夹中运行pod install
- 在相同文件夹中打开示例工作区
安装
CocoaPods
CocoaPods 是 Cocoa 项目的依赖管理器。
要安装 TokenRow,只需将以下行添加到您的 Podfile 中
pod 'TokenRow'
TokenSearchable
令牌行的值(即 TokenAccessoryRow 或 TokenTableRow)必须符合 TokenSearchable 协议。这样,您可以使用类或结构体作为此行的值,而不仅仅是字符串。TokenSearchable 协议的定义如下
public protocol TokenSearchable: Hashable {
var displayString: String { get }
func contains(token: String) -> Bool
var identifier: NSObject { get }
}
以下是每个参数的简要说明
displayString
:将用于获取要显示为令牌的字符串contains(token: String) -> Bool
用于筛选给定搜索字符串的选项。identifier
是令牌的标识符,且应在所有选项中是唯一的
注意,该值还必须符合
Hashable
协议,该协议反过来又需要Equatable
TokenRow 包含一个对 String
的扩展,使其符合 TokenSearchable
协议,这样您就可以使用任何具有字符串值的行。要使类符合此协议,可以进行如下操作
final class User {
var id: Int = 0
var name: String = ""
var avatar: String?
// conform to Hashable
var hashValue: Int {
return id
}
}
// conform to Equatable
func == (lhs: User, rhs: User) -> Bool {
return lhs.id == rhs.id
}
extension User: TokenSearchable {
func contains(token: String) -> Bool {
return name.contains(token)
}
var identifier: NSObject {
return id
}
var displayString: String {
return name
}
}
自定义
此行中许多与 SuggestionRow 和 GooglePlacesRow 非常类似。您可以在这些项目中找到一些有用的示例。
通用自定义
您可以更改 TokenRow 的几个部分。首先,如果您想更改包含令牌的视图,应查看 CLTokenInputView。
对于每一行,你必须做的操作是为用户提供选择标记的选项。传统的做法是将选项数组指定为行的(code>options变量
<< TokenAccessoryRow<String>() {
$0.options = ["Peter Schmeichel", "David de Gea", "Oliver Kahn", "Fabien Barthez", "Tim Howard", "Gianluigi Buffon"]
}
但是,你还可以通过重写getTokensForString
来提供选项。例如,你可以通过网络调用异步获取标记,并在响应到来后重新加载选项。例如
row.getTokensForString = { [weak self, row] string in
guard let me = self else { return nil }
Alamofire.SessionManager.default.request("https://api.github.com/search/users?q=\(text)&per_page=5")
.responseCollection(completionHandler: { (response: DataResponse<[User]>) in
switch response.result {
case let .success(value):
row.cell.filteredTokens = value
row.cell.reloadOptions()
case let .failure(error):
print(error)
}
})
return []
}
就这么简单(至少如果你熟悉Alamofire)。你可以在示例项目中看到这个功能的实际应用。
TokenAccessoryRow
TokenAccessoryRow使用一个通用的TokenCollectionCell
单元格,其泛型参数是用于输入辅助视图的UICollectionViewCell类。
-
如果你只想更改收集视图单元格的一些小事情(你很可能会这么做),那么
customizeCollectionViewCell
回调就是给你的。这个块在代理的collectionView:cellForItemAtIndexPath:
方法中被调用。 -
如果你想更改收集视图的布局,那么你可以在声明行时使用/修改/重写cellSetup方法中的
collectionViewLayout
属性。看看这个例子。 -
如果你想更改收集视图(例如,其高度、backgroundColor)的内容,你也可以在cellSetup方法中这样做。只需编辑你的单元格的
collectionView
变量中的任何东西。 -
如果你想极大地改变输入辅助视图的收集视图单元格,那么创建自己的行(
CustomAccessoryRow
)并添加自己的MyCollectionViewCell
是最简单的方法。
final class CustomAccessoryRow<T: TokenSearchable>: _TokenRow<T, CollectionTokenCell<T, MyCollectionViewCell<T>>>, RowType {
required init(tag: String?) {
super.init(tag: tag)
}
}
注意:你的自定义
MyCollectionViewCell
必须遵守EurekaTokenCollectionViewCell
TokenTableRow
TokenTableRow使用一个通用的TokenTableCell
单元格,其泛型参数是用于创建显示在带有建议选项的UITableView中的单元格的UITableViewCell类。
-
如果你只想更改显示选项的单元格的一些小事情,则可以在单元格上使用
customizeTableViewCell
回调。你应该在cellSetup
方法中定义它。此回调将在相应的tableView:cellForRowAtIndexPath:
方法中被调用。 -
你可以自定义显示选项的
tableView
的属性。你应该在cellSetup
中这样做,并记住每次显示TableView时都会重置TableView的frame。 -
如果你想更改选项TableView的单元格,那么创建自己的行(
MyTokenTableRow
)并使用自己的MyTableViewCell
是最简单的方法。
final class MyTokenTableRow<T: TokenSearchable>: _TokenRow<T, TableTokenCell<T, MyTableViewCell<T>>>, RowType {
required public init(tag: String?) {
super.init(tag: tag)
}
}
你还可以将TableTokenCell
改为任何你想要的类,以表示TokenRow单元格。
注意:确保你的单元格遵守
EurekaTokenTableViewCell
作者
变更日志
可以在 CHANGELOG.md 文件中找到。