FUISortFilterViewController
public class FUISortFilterViewController : FUIFormTableViewController
FUISortFilterViewController
allows users to narrow down results from a long list by setting criteria. Users are able to reset filters and return to the initial list.
Various ControlType
s, such as switch, filter, rating, etc. are supported for sort and filter criteria.
Initialization and Configuration Example:
let vc = FUISortFilterViewController()
// This is required. This is a 2D array of sort and filter criteria. The first dimension of the array is `UITableView` sections and the second dimension is `ControlTypes(cells`) for that section.
vc.values = [
[
.filter([0], ["Distance", "Availability", "Ratings", "Price"], "Sort by", false, true)
],
[
.switch(true, "Show Favorites"),
.listPicker([0], ["None", "John Smith", "Mary Jones", "Ronald Archer"], "Assigned To", false, false, true, true),
.switch(false, "Show My Work Orders"),
.filter([0, 2], ["Received", "Started", "Hold", "Transfer", "Completed", "Pending Review", "Rejected"], "Mobile Status"),
],
[
.datePicker(Date(), "Date and Time")
]
]
// This is required for `FUISortFilterViewController` to invoke it to update the UI to show the number of results based on the current sort and filter criteria.
vc.onChangeHandler = { [weak self] values, change in
// Returns the total number of items when no filter criteria have been provided.
if values.isEmpty {
return 20
}
/// your code goes here
return filteredNum
}
// Required.
vc.completionHandler = { [weak self] values, filteredNum in
/// your code goes here
}
let nav = UINavigationController(rootViewController: vc)
vc.modalPresentationStyle = .popover
vc.popoverPresentationController?.barButtonItem = sender
self.present(nav, animated: true)
Note:
The title and subtitle for UINavigationBar
and title for the Action button in the bottom UIToolbar
can be customized as well.
/// Customize the title and subtitle for `UINavigationBar`. This is optional.
vc.titleAndSubtitleHandler = { filteredResult, totalNum in
("Filter", "Orders \(filteredResult) of \(totalNum)")
}
/// Customize the title for the action button. This is optional.
vc.actionButtonTitleHandler = { filteredResult in
"Show \(filteredResult) orders"
}
FUISortFilterFormDelegate
Example:
vc.sortFilterFormDelegate = self
extension YourDelegateClass: FUISortFilterFormDelegate {
func cell(_ vc: FUISortFilterViewController, controlType: FUISortFilterViewController.ControlType, at indexPath: IndexPath) -> UITableViewCell? {
if indexPath == IndexPath(row: 0, section: 8) {
let tableView = vc.tableView
return tableView?.dequeueReusableCell(withIdentifier: "cellId", for: indexPath)
}
return nil
}
func configCell(_ vc: FUISortFilterViewController, controlType: FUISortFilterViewController.ControlType, at indexPath: IndexPath, cell: UITableViewCell) -> UITableViewCell {
if indexPath == IndexPath(row: 0, section: 1) {
if let theCell = cell as? FUIListPickerFormCell {
theCell.isPickerDismissedOnSelection = true
theCell.alwaysShowValueTextOnBottom = true
return theCell
}
}
return cell
}
}
-
Undocumented
See moreDeclaration
Swift
public enum ControlType
-
It is the initial state when then button “Reset” is tapped. The default value is the “values”.
Declaration
Swift
public var initValues: [[ControlType]]
-
2D array of sort and filter criteria. The first dimension of the array is comprised of sections and the second dimension is
ControlTypes
for that section.Declaration
Swift
public var values: [[ControlType]]
-
Required: the handler to calculate the filtered number of items.
Declaration
Swift
public var onChangeHandler: (([[ControlType]], ControlType?) -> Int)? { get set }
Parameters
value
The current values of all sort and filters.
change
The change sort or filter. This is optional.
Return Value
The filtered number of items.
-
required: The handler to invoke once the Action button is tapped.
Declaration
Swift
public var completionHandler: (([[ControlType]], Int) -> Void)?
Parameters
value
The current values of all sort and filters.
filteredNum
The current number of filtered items.
-
The title and subtitle handler for
UINavigationBar
. Subtitle is optional. The default handler returns (“Filter”, “Results (filteredNum) of (totalNum)”).Declaration
Swift
public var titleAndSubtitleHandler: ((Int, Int) -> (String, String?))
Parameters
filteredNum
The current number of filtered items. This can be used in the title or subtitle.
totalNum
The total number of items. This can be used in the title or subtitle.
Return Value
Title and subtitle. Subtitle is optional.
-
Title handler for the Action button. The default handler returns “Show (filteredNum) items”.
Declaration
Swift
public var actionButtonTitleHandler: ((Int) -> String)
Parameters
filteredNum
The current number of filtered items. This can be used in the title or subtitle.
Return Value
Title for the Action button.
-
delegate to config cells
Declaration
Swift
public weak var sortFilterFormDelegate: FUISortFilterFormDelegate?
-
Declaration
Swift
public override func viewDidLoad()
-
Declaration
Swift
public override func viewDidAppear(_ animated: Bool)
-
Undocumented
Declaration
Swift
public override func viewDidDisappear(_ animated: Bool)
-
Undocumented
Declaration
Swift
public override func numberOfSections(in tableView: UITableView) -> Int
-
Undocumented
Declaration
Swift
public override func tableView(_ tableView: UITableView, viewForFooterInSection section: Int) -> UIView?
-
Undocumented
Declaration
Swift
public override func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat
-
Undocumented
Declaration
Swift
public override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
-
Undocumented
Declaration
Swift
public override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell