内容
简介
SuggestionRow
是 Eureka iOS 表单构建器的行扩展,提供用户输入时的完成建议。可以实例化以下两种行
SuggestionAccessoryRow<T>
- 以标签形式在水平显示为键盘上方的collectionView
后提供完成建议。SuggestionTableRow<T>
- 在单元格下方提供一个表格,其中包含完成建议。
这两个类都是泛型,可以用于为符合 SuggestionValue
协议的任何类型提供完成建议
public protocol SuggestionValue: Equatable, InputTypeInitiable {
var suggestionString: String { get }
}
SuggestionRow
基于 GooglePlacesRow
构建
安装
CocoaPods
CocoaPods 是 Cocoa 项目的一个依赖管理器。
将 SuggestionRow
添加到您的项目中的 Podfile
文件。
pod 'SuggestionRow'
然后运行 pod install
。
Swift Package Manager
Swift Package Manager 是一个用于管理 Swift 代码分发的工具。
在设置好您的 Package.swift
清单文件后,您可以通过将它添加到 Package.swift
的依赖项值中来将 SuggestionRow 作为依赖项添加。
dependencies: [ .package(url: "https://github.com/EurekaCommunity/SuggestionRow.git", from: "3.3.0") ]
使用方法
SuggestionValue
协议
遵守 首先,您想要提供补全建议的类型必须遵守 SuggestionValue
协议。例如,考虑以下 Scientist struct
struct Scientist {
var id: Int
var firstName: String
var lastName: String
init(id: Int, firstName: String, lastName: String) {
self.id = id
self.firstName = firstName
self.lastName = lastName
}
}
要遵守 SuggestionValue
协议,添加一个 suggestionString
方法,指定如何将 Scientist
显示为建议。这是将进入 inputAccessoryView
中的标签或在建议 UITableView
中的行中的文本。对于 Scientist
,显示完整的名称是一个不错的选择,如下所示。 Scientist
还必须遵守 Equatable
和 InputTypeInitiable
,这是 SuggestionValue
所要求的。 InputTypeInitiable
是由 Eureka
定义的协议,它要求有一个可选的初始化器,它接受一个 String
。它用于确定如何从 UITextField
的内容中实例化值。在这种情况下,用户的输入文本用于过滤现有值但不会创建新值,因此初始化器可以返回 nil。
extension Scientist: SuggestionValue {
// Required by `InputTypeInitiable`, can always return nil in the SuggestionValue context.
init?(string stringValue: String) {
return nil
}
// Text that is displayed as a completion suggestion.
var suggestionString: String {
return "\(firstName) \(lastName)"
}
}
为了遵守Equatable
协议,在全局范围内实现 ==
运算符
func == (lhs: Scientist, rhs: Scientist) -> Bool {
return lhs.id == rhs.id
}
实例化行
在您的表单中添加一行,类型为 SuggestionAccessoryRow<Scientist>
或 SuggestionTableRow<Scientist>
。您必须定义行的 filterFunction
以确定完成建议的来源以及如何根据用户输入进行选择。您设置为 filterFunction
的函数必须接受一个 String
参数(用户输入的内容)并返回一个 Scientist
(有效建议)的数组。这个函数在用户输入字段每次更改时都会被调用。以下例子也位于 SuggestionExampleViewController
let users: [Scientist] = [Scientist(id: 1, firstName: "Albert", lastName: "Einstein"),
Scientist(id: 2, firstName: "Isaac", lastName: "Newton")]
...
form +++ Section("Table suggestions")
<<< SuggestionTableRow<Scientist>() {
$0.filterFunction = { [unowned self] text in
self.users.filter({ $0.firstName.lowercased().contains(text.lowercased()) })
}
$0.placeholder = "Search for a famous scientist"
}
运行示例
要运行示例,请按照以下步骤操作
- 克隆或下载此存储库
- 在根目录中运行
carthage update
- 运行项目
自定义
SuggestionTableRow
SuggestionTableRow
使用一个通用的 SuggestionTableCell
单元格,其泛型参数是用于在 UITableView
中显示建议选项的 UITableViewCell
类。
-
如果您想对建议表格行单元格进行微小的视觉更改,请使用
customizeTableViewCell
回调。 -
您可以为显示选项的
tableView
自定义属性。您应该在cellSetup
中这样做,并注意每次tableView
显示时都会重置其框架。 -
如果您想要对单元格进行大幅更改,创建自己的行,使用自己的单元格类,该类遵守
EurekaSuggestionTableViewCell
。例如
final class MySuggestionTableRow<T: SuggestionValue>: _SuggestionRow<MySuggestionTableCell<T, SuggestionTableViewCell<T>>>, RowType {
required public init(tag: String?) {
super.init(tag: tag)
}
}
class MySuggestionTableCell<T, TableViewCell: UITableViewCell>: SuggestionTableCell<T, TableViewCell> where TableViewCell: EurekaSuggestionTableViewCell, TableViewCell.S == T {
// ...
}
open class MySuggestionTableViewCell<T: SuggestionValue>: SuggestionTableViewCell<T> {
// ...
}
这里 MySuggestionTableCell
是行的实际单元格,而 MySuggestionTableViewCell
是用于显示建议的单元格。
查看默认单元格的源代码以获取灵感。
建议附件行
建议附件行
使用一个通用的 建议收集单元格
单元格,其泛型参数是 UICollectionViewCell
类,用于 inputAccessoryView
。
-
如果您想进行细微的视觉修改,请使用
customizeCollectionViewCell
回调。 -
如果您想改变 collectionView 的布局,则可以在声明行时使用/修改/覆盖
cellSetup
方法中的collectionViewLayout
属性。 -
如果您想改变 collectionView 的某些内容(例如其高度、背景颜色),您也可以在
cellSetup
方法中做到这一点。 -
如果您想极大地改变 inputAccessoryView 的集合视图单元格,创建一个包含你自己的单元格类的自定义行(
MySuggestionAccessoryRow
),该类符合EurekaSuggestionCollectionViewCell
。这与上面提到的SuggestionTableRow
示例非常相似。
依赖项
- Eureka
要求
- iOS 9.3+
- Xcode 11+
- Swift 5.0
参与进来
- 如果您希望 做出贡献,请随时 提交拉取请求。
- 如果您 有功能请求,请 打开问题。
- 如果您 发现了错误 或 需要帮助,请在提交问题之前请 查看旧问题。