Filter List (Numeric)
About this widget
FilterList.Numeric
is a filtering view that displays any kind of numeric filters and lets the user refine the search results by selecting them.
Compared to the RefinementList
, which takes its values from the search response facets, this widget displays numeric filters that you add yourself.
To add a filter list to your search experience, use these components:
Searcher
: TheSearcher
that handles your searches.FilterState
: The current state of the filters.NumericFilterListInteractor
: The logic applied to the numeric filters.FilterListController
: The view that will render the numeric filters.
Examples
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
class NumericFilterListViewController: UIViewController {
let searcher: SingleIndexSearcher = SingleIndexSearcher(appID: "YourApplicationID",
apiKey: "YourSearchOnlyAPIKey",
indexName: "YourIndexName")
let filterState: FilterState = .init()
let numericFilters: [Filter.Numeric] = [
.init(attribute: "price", operator: .lessThan, value: 5),
.init(attribute: "price", range: 5...10),
.init(attribute: "price", range: 10...25),
.init(attribute: "price", range: 25...100),
.init(attribute: "price", operator: .greaterThan, value: 100)
]
lazy var filterListInteractor: NumericFilterListInteractor = { .init(items: numericFilters) }()
let filterListController: FilterListTableController<Filter.Numeric> = .init(tableView: UITableView())
override func viewDidLoad() {
super.viewDidLoad()
setup()
}
func setup() {
searcher.connectFilterState(filterState)
filterListInteractor.connectFilterState(filterState, operator: .or)
filterListInteractor.connect(to: filterListController)
searcher.search()
}
}
Parameters
items
|
type: [Filter.Numeric]
default: []
Required
The numeric filters to display. |
||
Copy
|
|||
operator
|
type: RefinementOperator
Required
Whether we apply an For example if we have an |
||
Copy
|
|||
selectionMode
|
type: SelectionMode
default: .single
Optional
Whether the list can have |
||
Copy
|
Customize your view
The controllers provided by default, like the FilterListTableController
work well when you want to use native UIKit with their default behavior.
If you want to use another component such as a UICollectionView
, a third-party input view, or you want to introduce some custom behavior to the already provided UIKit component, you can create your own controller conforming to the NumericFilterListController
protocol.
Protocol
var onClick: ((Filter.Numeric) -> Void)?
:
Closure to call when a filter is clicked.
func setSelectableItems(selectableItems: [SelectableItem<Filter.Numeric>])
Function called when a new array of selectable facets is updated. This is the UI State of the refinement list.
func reload()
Function called when we require a reload of the list view.
Example
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
class NumericFilterListTableController: NSObject, NumericFilterListController, UITableViewDataSource, UITableViewDelegate {
public var onClick: ((Filter.Numeric) -> Void)?
public let tableView: UITableView
public var selectableItems: [SelectableItem<Filter.Numeric>] = []
public var filterPresenter: FilterPresenter?
let cellID: String
public init(tableView: UITableView, cellID: String = "cellID") {
self.tableView = tableView
self.cellID = cellID
super.init()
tableView.dataSource = self
tableView.delegate = self
tableView.register(UITableViewCell.self, forCellReuseIdentifier: cellID)
}
// MARK: - FilterListController
public func setSelectableItems(selectableItems: [SelectableItem<Filter.Numeric>]) {
self.selectableItems = selectableItems
}
public func reload() {
tableView.reloadData()
}
// MARK: - UITableViewDataSource
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return selectableItems.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: cellID, for: indexPath)
let filter = selectableItems[indexPath.row]
let filterPresenter = self.filterPresenter ?? DefaultPresenter.Filter.present
cell.textLabel?.text = filterPresenter(Filter(filter.item))
cell.accessoryType = filter.isSelected ? .checkmark : .none
return cell
}
// MARK: - UITableViewDelegate
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let selectableItem = selectableItems[indexPath.row]
onClick?(selectableItem.item)
}
}