About this widget #
Current Refinements shows the currently active refinements within a given FilterState and lets users remove filters individually.
To add current refinements to your search experience, use these components:
CurrentFiltersInteractor: The logic for current refinements in theFilterState.FilterState: The current state of the filters.CurrentFiltersController: The controller that interfaces with a concrete current refinement view.Presenter: Optional. The presenter that defines the way we want to display a filter.
Examples #
1
2
3
4
5
6
7
8
9
10
11
let currentFiltersInteractor: CurrentFiltersInteractor = .init()
let currentFiltersController: CurrentFilterListTableController = .init(tableView: UITableView())
let filterState: FilterState = .init()
override func viewDidLoad() {
super.viewDidLoad()
currentFiltersInteractor.connectFilterState(filterState)
currentFiltersInteractor.connectController(currentFiltersController)
}
Parameters #
Presenter #
Filter Presenter
# |
type: (Filter) -> String
Optional
The presenter that defines the way we want to display a filter. |
||
|
Edit
Copy
|
|||
Customize your view#
The controllers provided by default, like the CurrentFilterListTableController work well when you want to use native UIKit with their default behavior.
If you want to use another component (other than a UITableView) 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 CurrentFiltersController protocol.
Protocol#
func setItems(_ item: [FilterAndID]):
Function called when current filters are refreshed and need to be updated.
Note that FilterAndID is a struct that contains the filter, its ID, and the text representation of the filter
var onRemoveItem: ((FilterAndID) -> Void)?:
Closure to call when a “remove filter” intention is detected on the corresponding current filter.
func reload():
Function called when the view needs to reload itself with new data.
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
open class CurrentFilterListTableController: NSObject, CurrentFiltersController, UITableViewDataSource, UITableViewDelegate {
open var onRemoveItem: ((FilterAndID) -> Void)?
public let tableView: UITableView
public var items: [FilterAndID] = []
private let cellIdentifier = "CurrentFilterListTableControllerCellID"
public init(tableView: UITableView) {
self.tableView = tableView
super.init()
tableView.dataSource = self
tableView.delegate = self
tableView.register(UITableViewCell.self, forCellReuseIdentifier: cellIdentifier)
}
open func setItems(_ item: [FilterAndID]) {
items = item
}
open func reload() {
tableView.reloadData()
}
// MARK: - UITableViewDataSource
open func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return items.count
}
open func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier, for: indexPath)
let filterAndID = items[indexPath.row]
cell.textLabel?.text = filterAndID.text
return cell
}
// MARK: - UITableViewDelegate
open func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
onRemoveItem?(items[indexPath.row])
}
}